Linq конвертировать в пользовательский словарь? - PullRequest
1 голос
/ 09 мая 2011

.NET 4, у меня есть

public class Humi
{
public int huKey { get; set; }
public string huVal { get; set; }
}

И в другом классе этот код в методе:

IEnumerable<Humi> someHumi = new List<Humi>(); //This is actually ISingleResult that comes from a LinqToSql-fronted sproc but I don't think is relevant for my question
var humia = new Humi { huKey = 1 , huVal = "a"};
var humib = new Humi { huKey = 1 , huVal = "b" };
var humic = new Humi { huKey = 2 , huVal = "c" };
var humid = new Humi { huKey = 2 , huVal = "d" };

Я хочу создать один IDictionary <int,string[]>

с ключом 1, содержащим ["a", "b"] и ключом 2, содержащим ["c", "d"]

Может ли кто-нибудь указать достойный способ такого преобразования с помощью Linq?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Вы можете использовать ToLookup () , который позволяет каждому ключу содержать несколько значений, точно ваш сценарий (обратите внимание, что каждый ключ будет содержать IEnumerable<string> значений, но не массив):

var myLookup = someHumi.ToLookup(x => x.huKey, x => x.huVal);

foreach (var item in myLookup)
{
    Console.WriteLine("{0} contains: {1}", item.Key, string.Join(",", item));
}

Выход:

1 содержит: a, b

2 содержит: c, d

2 голосов
/ 09 мая 2011
var myDict = someHumi
    .GroupBy(h => h.huKey)
    .ToDictionary(
        g => g.Key,
        g => g.ToArray())

Создайте IEnumerable<IGrouping<int, Humi>> и затем спроецируйте его в словарь.Примечание .ToDictionary возвращает словарь, а не IDictionary.

...