C# 将列表转换为字典
我想获取一个对象列表,并将其转换为字典,其中键是对象中的一个字段,值是对象中与键匹配的不同字段的列表。我现在可以通过循环来实现这一点,但我觉得这应该可以通过linq实现,而不必编写循环。我本来想把GroupBy和ToDictionary结合起来,但到目前为止还没有成功 我现在是这样做的:C# 将列表转换为字典,c#,.net,linq,C#,.net,Linq,我想获取一个对象列表,并将其转换为字典,其中键是对象中的一个字段,值是对象中与键匹配的不同字段的列表。我现在可以通过循环来实现这一点,但我觉得这应该可以通过linq实现,而不必编写循环。我本来想把GroupBy和ToDictionary结合起来,但到目前为止还没有成功 我现在是这样做的: var samplesWithSpecificResult = new Dictionary<string, List<int>>(); foreach(var sample in sa
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.todictionary就是字典
任何帮助都将不胜感激
var samplesWithSpecificResult =
sampleList.GroupBy(s => s.ResultString)
.ToDictionary(g => g.Key, g => g.Select(s => s.ID).ToList());
我们在这里所做的是根据它们的结果字符串对样本进行分组——这将它们放入一个iGroup中。然后我们将iGroup集合投影到一个字典中,使用每个组的键作为字典键,并对每个组进行枚举。iGroup也是一个IEnumerable,用于选择每个样本的ID,从而为字典值创建一个列表。是的,非常简单。关键是在IEnumerable上执行GroupBy时,每个组都是一个实现IEnumerable的对象,这就是为什么我可以说g。下面选择,我用一个公共键投影原始序列的元素:
var dictionary =
sampleList.GroupBy(x => x.ResultString)
.ToDictionary(
g => g.Key,
g => g.Select(x => x.ID).ToList()
);
请参见,sampleList.GroupByx=>x.ResultString的结果是一个IEnumerable,而iGroup实现了IEnumerable,因此每个组都是一个带有公共键的样本序列 试试下面的方法
var dictionary = sampleList
.GroupBy(x => x.ResultString, x => x.ID)
.ToDictionary(x => x.Key, x => x.ToList());
GroupBy子句将根据其ResultString成员对列表中的每个示例实例进行分组,但它只保留每个示例的Id部分。这意味着每个元素都是一个
ToDictionary部分使用iGroup的键作为字典键。iGroup实现IEnumerable,因此我们可以通过调用ToList将样本Id的集合转换为列表,ToList将成为给定键的字典值
您可能想考虑使用查找而不是列表< /p>的字典。
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();
学会爱上搜索,这是一个好主意,我一定会玩的。谢谢这正是我想要的。谢谢谢谢你的回答!通过反复试验找出这些细节需要一些时间。
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();