Какую структуру данных C # мне следует использовать, чтобы отобразить различное количество пар ключ / значение в список строк? - PullRequest
0 голосов
/ 16 февраля 2011

Допустим, я хочу получить список всех адресов в моем районе.И я также хочу связать имя и номер телефона друга, если они живут по любому из адресов.Но не у каждого адреса есть друг, живущий там, поскольку совершенно незнакомые люди живут по многим адресам, но, наоборот, по одному адресу может жить более одного друга.

Подводя итог, мне нужен как список адресов, так и связи со всеми этими строками в виде пары имя / телефон # для всех друзей, которые живут по этим адресам.Индексом для поиска по этим данным является только адрес, мне не нужен доступ к информации по имени или по номеру телефона, но я хотел бы пройтись по этим данным, если у адреса есть друзья, живущие там.

Какую структуру данных C # лучше всего использовать в этой ситуации, и не могли бы вы дать мне пример кода, демонстрирующего ее реализацию?Большое спасибо.

Ответы [ 3 ]

1 голос
/ 16 февраля 2011

Вы должны создать типы, представляющие ваш домен. Что-то вроде:

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;
1 голос
/ 16 февраля 2011

Класс «Словарь» - ваш лучший выбор.Я бы также создал вспомогательный класс для хранения пар имя / телефон # ключ-значение, даже если вы можете использовать один из собственных классов 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 голосов
/ 16 февраля 2011

Вы, вероятно, захотите 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) 
{
    ...
}
...