Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将列表转换为字典_C#_.net_Linq - Fatal编程技术网

C# 将列表转换为字典

C# 将列表转换为字典,c#,.net,linq,C#,.net,Linq,我想获取一个对象列表,并将其转换为字典,其中键是对象中的一个字段,值是对象中与键匹配的不同字段的列表。我现在可以通过循环来实现这一点,但我觉得这应该可以通过linq实现,而不必编写循环。我本来想把GroupBy和ToDictionary结合起来,但到目前为止还没有成功 我现在是这样做的: var samplesWithSpecificResult = new Dictionary<string, List<int>>(); foreach(var sample in sa

我想获取一个对象列表,并将其转换为字典,其中键是对象中的一个字段,值是对象中与键匹配的不同字段的列表。我现在可以通过循环来实现这一点,但我觉得这应该可以通过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.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();