将 List 转换为字典>

本文关键字:List obj string ID 转换 MyObject 字典 | 更新日期: 2023-09-27 18:10:04

我想获取一个对象列表并将其转换为字典,其中键是对象中的一个字段,值是对象中与键匹配的不同字段的列表。我现在可以使用循环来做到这一点,但我觉得这应该可以用 linq 完成,而不必编写循环。我曾想过GroupByToDictionary的结合,但到目前为止还没有成功。

这是我现在的做法:

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>>.

任何帮助将不胜感激。

将 List<MyObject> 转换为字典<obj.string, List<obj.ID>>

尝试以下操作

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转换为调用 ToListList<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,以创建字典值的列表。

相关文章: