我想获取一个对象列表并将其转换为一个字典,其中键是对象中的一个字段,该值是对象上与键匹配的不同字段的列表。我现在可以通过循环执行此操作,但我觉得应该可以使用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>>
。
任何帮助都将不胜感激。
答案 0 :(得分:40)
尝试以下
var dictionary = sampleList
.GroupBy(x => x.ResultString, x => x.ID)
.ToDictionary(x => x.Key, x => x.ToList());
GroupBy
子句会按其Sample
成员对列表中的每个ResultString
实例进行分组,但它只会保留每个样本的Id
部分。这意味着每个元素都是IGrouping<string, int>
。
ToDictionary
部分使用Key
的{{1}}作为字典键。 IGrouping<string, int>
实施IGrouping<string, int>
,因此我们可以通过调用IEnumerable<int>
将该样本集Id
转换为List<int>
,这将成为ToList
给出Value
的字典。
答案 1 :(得分:3)
是的,超级简单。关键是,当您在GroupBy
上执行IEnumerable<T>
时,每个“组”也是一个实现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>
,以便每个组的序列为{{1}使用公共密钥!
答案 2 :(得分:3)
Dictionary<string, List<int>> resultDictionary =
(
from sample in sampleList
group sample.ID by sample.ResultString
).ToDictionary(g => g.Key, g => g.ToList());
您可能需要考虑使用Lookup而不是列表词典
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();
答案 3 :(得分:1)
var samplesWithSpecificResult =
sampleList.GroupBy(s => s.ResultString)
.ToDictionary(g => g.Key, g => g.Select(s => s.ID).ToList());
我们在这里做的是根据他们的ResultString
对样本进行分组 - 这会将它们放入IGrouping<string, Sample>
。然后我们将IGrouping
s的集合投影到字典中,使用每个Key
作为字典键,并枚举每个分组(IGrouping<string, Sample>
也是IEnumerable<Sample>
)到选择每个样本的ID
以列出字典值。