Виберіть Словник <T1, T2> з LINQ


171

Я використовував ключове слово "select" та метод розширення, щоб повернути IEnumerable<T>LINQ, але у мене є необхідність повернути загальний Dictionary<T1, T2>і не можу це зрозуміти. Приклад, який я дізнався про це, використовував щось у формі, подібній до наступної:

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 };

Я теж робив те ж саме із методами розширення. Я припускав, що оскільки елементи в Dictionary<T1, T2>анекдоті можна повторити, так KeyValuePair<T1, T2>що я міг просто замінити "SomeClass" у наведеному вище прикладі на " new KeyValuePair<T1, T2> { ...", але це не спрацювало (Ключ і значення були позначені як прочитані тільки тому, тому я не міг скомпілювати цей код ).

Чи це можливо, чи мені потрібно це робити в кілька етапів?

Дякую.

Відповіді:


284

Методи розширень також забезпечують розширення ToDictionary . У використанні досить просте, загальне використання - це передача лямбда-селектора для ключа та отримання об'єкта як значення, але ви можете передавати лямбда-селектор як ключа, так і значення.

class SomeObject
{
    public int ID { get; set; }
    public string Name { get; set; }
}

SomeObject[] objects = new SomeObject[]
{
    new SomeObject { ID = 1, Name = "Hello" },
    new SomeObject { ID = 2, Name = "World" }
};

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name);

Потім objectDictionary[1]міститиме значення "Привіт"


44
var dictionary = (from x in y 
                  select new SomeClass
                  {
                      prop1 = value1,
                      prop2 = value2
                  }
                  ).ToDictionary(item => item.prop1);

Це припущення, що SomeClass.prop1це бажане Keyдля словника.


27
.ToDictionary(item => item.prop1, item => item.prop2);для explicity також встановити значення.
finoutlook

42

Колекція KeyValuePairще більш чітка і виконана дуже добре.

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);

Чи можна видалити .ToDictionary (x => x.Key, x => x.Value); і замінити новий KeyValuePair на новий словник?
Амір Гаджіха

@ AmirNo Family Ви помиляєтесь. Вибір (x => x ...) методу виконує проекцію для кожного елемента колекції об'єктів . Таким чином, заміна нового KeyValuePair на новий диктатор створить словник словників. Я не думаю, що саме на це ти прагнеш.
Антуан Мельцхайм

У мене є список Словника <string, string> і намагався використовувати select на них, але він видає помилку компіляції.
Амір Гаджіха
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.