将List <myobject>转换为Dictionary <obj.string,list <obj.id =“”>&gt; </obj.string,> </myobject>

时间:2011-09-30 18:50:50

标签: c# .net linq

我想获取一个对象列表并将其转换为一个字典,其中键是对象中的一个字段,该值是对象上与键匹配的不同字段的列表。我现在可以通过循环执行此操作,但我觉得应该可以使用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>>

任何帮助都将不胜感激。

4 个答案:

答案 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以列出字典值。