2011-02-16 16 views
0

比方说,我想要列出我附近的所有地址。如果他们住在任何地址,我也想将朋友的姓名和电话号码关联起来。但并不是每个地址都有一个住在那里的朋友,因为完全陌生的人住在很多地址,但相反地,不止一个朋友可能住在同一个地址。总的来说,我需要一个地址列表,以及所有这些字符串的关联,这些字符串以名称/电话号码对的形式出现在任何居住在这些地址的朋友身上。搜索这些数据的索引只是地址,我不需要通过名字或电话号码访问信息,但如果地址有朋友住在那里,我想循环访问这些数据。我应该用什么C#数据结构将不同数量的键/值对映射到字符串列表?

什么是最好的C#数据结构在这种情况下使用,你可能给我一些示例代码显示它的实现?非常感谢。

回答

1

Dictionary类是您的最佳选择。即使您可以使用本机KeyValuePair或Tuple类之一,我也会创建一个帮助类来存储名称/电话号码键值对。最后,代码如下所示:

class ContactInfo 
{ 
    string Name; 
    string TelephoneNumber; 
} 

Dictionary<string, ICollection<ContactInfo>> addressAndPeopleLivingThere = 
    new Dictionary<string, ICollection<ContactInfo>>(); 

addressAndPeopleLivingThere.Add("1 Some Street", new List<ContactInfo>()); 
addressAndPeopleLivingThere["1 Some Street"].Add(new ContactInfo { Name = "Name", TelephoneNumber = "000-000-0000" }); 
+0

谢谢帮助,这对我来说是最清楚的答案。 – Monochrome 2011-02-16 01:16:18

+0

如何迭代每个ContactInfo类的属性,将其值输出到控制台?对于Dictionary的关键字,我没有任何问题,但是我创建的每个类都有哪些?这是我已经得到了钥匙: 的foreach(KeyValuePair <字符串,ICollection的> KVP在addressAndPeopleLivingThere { Console.WriteLine(kvp.Key);} – Monochrome 2011-02-16 03:19:58

1

您应该创建表示您的域的类型。 喜欢的东西:

public class Address{ 
    public string StreetName{get;set;} 
    public List<Person> Friends{get;set;} 
} 
public class Person{ 
    public string Name{get;set;} 
    public string Phone{get;set;} 
} 

,那么你在操作的列表。

List<Address> addresses = new List<Address>; 

    var addWithFriends = from c in addresses where c.Count > 0 select c; 
0

你可能想的ILookup<string, Friend>Dictionary<string, IEnumerable<Friend>>,这基本上相当于同样的事情。既然你要包括所有的地址,建设将是一个小比简单ToDictionaryToLookup更复杂,但它也不是太糟糕:

var friendsByAddress = friends.ToLookup(f => f.Address); 
var addressesWithFriends = addresses.ToDictionary(
    a => a, 
    a => !friendsByAddress.Contains(a) ? Enumerable.Empty<Friend>() : friendsByAddress[a]); 

使用这个很简单:

var friendsAtAddress = addressesWithFriends[address]; 
foreach(var friend in friends) 
{ 
    ... 
} 
相关问题