Создайте словарь в списке с группировкой
У меня есть следующий объект в списке:
public class DemoClass
{
public int GroupKey { get; set; }
public string DemoString { get; set; }
public object SomeOtherProperty { get; set; }
}
Теперь я хочу создать из него следующий словарь:
Dictionary<int, List<DemoClass>>
Я хочу сгруппировать List<DemoClass>
с помощью свойства GroupKey
, но я не понимаю, как это делается и какая помощь.
Подумав немного, я достиг необходимого поведения с помощью:
var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
group demoClass by demoClass.GroupKey
into groupedDemoClass
select groupedDemoClass;
var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
но есть ли способ сделать это одним выражением?
Ответы
Ответ 1
var groupedDemoClasses = (from demoClass in mySepcialVariableWhichIsAListOfDemoClass
group demoClass by demoClass.GroupKey
into groupedDemoClass
select groupedDemoClass).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
Этот будет работать!!!
Ответ 2
Просто чтобы сделать предложение mquander конкретным:
var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
.GroupBy(x => x.GroupKey)
.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());
Вы бы сократили это, если бы использовали короткие имена переменных, конечно:)
Однако могу ли я предположить, что Lookup может быть более уместным? Поиск - это в основном словарь от ключа до IEnumerable<T>
- если вам действительно не нужны значения в виде списка, он делает код еще короче (и более эффективным) с ToLookup:
var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
.ToLookup(x => x.GroupKey);
Ответ 3
Вы уже сделали его одним лайнером. Просто поставьте ToDictionary
в конце вашей первой строки. Если вы хотите, чтобы он был короче, используйте синтаксис функциональной композиции вместо синтаксиса запроса.
Ответ 4
Я немного отвлекся от темы, но я добрался до этой темы, потому что искал способ создания словаря словаря в Linq, и беседа привела меня к ответу...
Вы можете использовать linq для создания многоуровневых словарей, что полезно для сценариев, в которых у вас есть более одного ключа или измерения, которые вы хотите выполнить. Хитрость заключается в создании группировки, а затем преобразовании ее в словарь, как показано ниже:
Dim qry = (From acs In ActualSales _
Group By acs.ProductID Into Group _
Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
).ToDictionary(Function(c) c.ProductID)
Полученный запрос может быть использован следующим образом:
If qry.ContainsKey(_ProductID) Then
With qry(_ProductID)
If .Months.ContainsKey(_Period) Then
...
End If
End With
End If
Надеемся, что это будет полезно для всех, кому этот запрос нужен.