Словарь или KeyValuePair без ограничения KEY - PullRequest
0 голосов
/ 25 мая 2011

Мне нужно вернуть список из двух значений. Я попробовал словарь, но первый параметр - это ключ, и в моем случае он будет повторяться Мой список должен вернуть что-то вроде этого:

Менеджер - Джон Замберс

Разработчик - Пол Майерс

Разработчик - Джон Замберс

Тестер - Мэри Мари

и т.д ... - и т.д ...

Я не хочу создавать свой собственный класс для представления этого списка. Dot.Net имеет встроенный тип, который представляет его? Что-то вроде List ()?

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 25 мая 2011

Вы можете использовать класс System.Tuple<T1, T2>, например:

List<Tuple<String, String>> people = new List<Tuple<String, String>>();
people.Add(Tuple.Create("Manager", "John Zambers"));
// etc.

Однако что не так с созданием вашего собственного класса?Они могут быть почти самодокументируемыми, особенно в таком простом случае, как этот (например, очевидно, что будет в поле Name).Например:

public class Person
{
   public string Role { get; set; }
   public string Name { get; set; }
}

Примечание: я не знаю вашу область приложения или какие у вас есть все возможные роли / названия, но если вы выполняете какую-либо обработку на основе этого значения, это выглядиткак хорошее место, чтобы использовать вместо него enum.Например,

public enum Roles
{
    Manager,
    Developer,
    Tester
}
1 голос
/ 25 мая 2011

Попробуйте:

List<KeyValuePair<string,string>> list = new List<KeyValuePair<string,string>>();
list.Add(new KeyValuePair<string, string>("Manager", "John"));
list.Add(new KeyValuePair<string, string>("Manager", "John"));
Console.WriteLine(list[0].Key);

Вы также можете использовать что-то вроде System.Web.UI.Pair (что не является общим, но иногда довольно удобным).

Но вы должны использовать его, только если действительно не имеет значения, что первое - это позиция, а второе - это имя.Если вы хотите относиться к нему как к другой паре чего-либо - используйте KeyValuePair или Pair.Но если это список пары позиции и имени, было бы неплохо создать для него специальный тип.

1 голос
/ 25 мая 2011

Как насчет этого?

Dictionary<string, List<string>> role_names = new Dictionary<string, List<string>>();
List<string> lst;

role_names.Add("Manager", lst = new List<string>());
lst.Add("John Zambers");

role_names.Add("Developer", lst = new List<string>());
lst.Add("Paul Myers");
lst.Add("John Zambers");

role_names.Add("Tester", lst = new List<string>());
lst.Add("Mary Marie");
0 голосов
/ 25 мая 2011

.NET имеет класс для такого рода вещей, но вы не можете использовать его напрямую.Это Lookup и возвращается методом ToLookup в LINQ.

Если вы можете найти способ использовать ToLookup на любом источнике, который вы получили для своегоданные, это сделает вашу жизнь намного проще.

Вы всегда можете использовать мою реализацию Lookup из Edulinq , если хотите.По сути, обе реализации являются неизменяемыми извне самой сборки, но вы можете изменить мою на изменяемую, если хотите:)

...