[英]What C# data structure should I use to map a varying number of key/value pairs to a list of strings?
假设我想要一个包含邻居所有地址的列表。 如果他们住在任何一个地址,我也想关联一个朋友的姓名和电话号码。 但并不是每个地址都有一个朋友住在那里,因为完全陌生人住在许多地址,但相反,不止一个朋友可能住在一个地址。
总而言之,对于住在这些地址的任何朋友,我需要一个地址列表,以及名称/电话号对形式的所有字符串的关联。 搜索此数据的索引只是地址,我不需要按名称或电话号码访问信息,但如果地址中有朋友住在那里,我想迭代这些数据。
在这种情况下使用的最佳C#数据结构是什么,您是否可以给我一些显示它实现的示例代码? 非常感谢。
Dictionary类是您的最佳选择。 我还创建了一个用于存储Name / Phone#键值对的辅助类,即使您可以使用其中一个本机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" });
您应该创建代表您的域的类型。 就像是:
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;
你可能想要一个ILookup<string, Friend>
或一个Dictionary<string, IEnumerable<Friend>>
,这基本上是相同的。 由于您想要包含所有地址,因此构造将比简单的ToDictionary
或ToLookup
复杂一点,但它并不太糟糕:
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)
{
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.