将 List 转换为字典>
本文关键字:List obj string ID 转换 MyObject 字典 | 更新日期: 2023-09-27 18:10:04
我想获取一个对象列表并将其转换为字典,其中键是对象中的一个字段,值是对象中与键匹配的不同字段的列表。我现在可以使用循环来做到这一点,但我觉得这应该可以用 linq 完成,而不必编写循环。我曾想过GroupBy
和ToDictionary
的结合,但到目前为止还没有成功。
这是我现在的做法:
var samplesWithSpecificResult = new Dictionary<string, List<int>>();
foreach(var sample in sampleList)
{
List<int> sampleIDs = null;
if (samplesWithSpecificResult.TryGetValue(sample.ResultString, out sampleIDs))
{
sampleIDs.Add(sample.ID);
continue;
}
sampleIDs = new List<int>();
sampleIDs.Add(sample.ID);
samplesWithSpecificResult.Add(sample.ResultString, sampleIDs);
}
我能和.GroupBy().ToDictionay()
走得最远的是Dictionary<sample.ResultString, List<sample>>
.
任何帮助将不胜感激。
尝试以下操作
var dictionary = sampleList
.GroupBy(x => x.ResultString, x => x.ID)
.ToDictionary(x => x.Key, x => x.ToList());
GroupBy
子句将按其ResultString
成员对列表中的每个Sample
实例进行分组,但它将仅保留每个样本的Id
部分。 这意味着每个元素都将是一个 IGrouping<string, int>
.
ToDictionary
部分使用IGrouping<string, int>
的Key
作为字典键。 IGrouping<string, int>
实现了IEnumerable<int>
,因此我们可以将该样本集合的Id
转换为调用 ToList
的List<int>
,这成为给定Key
字典的Value
。
是的,超级简单。关键是当你对IEnumerable<T>
进行GroupBy
时,每个"组"也是一个实现IEnumerable<T>
的对象(这就是为什么我可以在下面说g.Select
,我用一个公共键投影原始序列的元素(:
var dictionary =
sampleList.GroupBy(x => x.ResultString)
.ToDictionary(
g => g.Key,
g => g.Select(x => x.ID).ToList()
);
看,sampleList.GroupBy(x => x.ResultString)
的结果是一个IEnumerable<IGrouping<string, Sample>>
,IGrouping<T, U>
实现IEnumerable<U>
,因此每个组都是具有公共键的Sample
序列!
Dictionary<string, List<int>> resultDictionary =
(
from sample in sampleList
group sample.ID by sample.ResultString
).ToDictionary(g => g.Key, g => g.ToList());
您可能需要考虑使用查找而不是列表字典
ILookup<string, int> idLookup = sampleList.ToLookup(
sample => sample.ResultString,
sample => sample.ID
);
这样使用
foreach(IGrouping<string, int> group in idLookup)
{
string resultString = group.Key;
List<int> ids = group.ToList();
//do something with them.
}
//and
List<int> ids = idLookup[resultString].ToList();
var samplesWithSpecificResult =
sampleList.GroupBy(s => s.ResultString)
.ToDictionary(g => g.Key, g => g.Select(s => s.ID).ToList());
我们在这里所做的是根据样本ResultString
对样本进行分组 - 这会将它们放入一个IGrouping<string, Sample>
中。然后我们将IGrouping
的集合投影到字典中,使用每个Key
作为字典键,并枚举每个分组(IGrouping<string, Sample>
也是一个IEnumerable<Sample>
(以选择每个样本的ID
,以创建字典值的列表。