繁体   English   中英

我应该使用什么C#数据结构将不同数量的键/值对映射到字符串列表?

[英]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>> ,这基本上是相同的。 由于您想要包含所有地址,因此构造将比简单的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) 
{
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM