获取值的首次出现

时间:2019-01-04 18:18:44

标签: c# linq

我正在尝试首先按特定属性分组的值的第一次出现。

我有一个列表monthlyResults,其中包含对象列表。这些对象定义为:

class MyObj {
    public string PropA;
    public string PropB;
    public string PropC;
}

monthlyResults中的样本数据可能类似于:

monthlyResults[0]
    monthlyResults[0][0] // { PropA = "2018-09", PropB = "foo", PropC = "apple" }
    monthlyResults[0][1] // { PropA = "2018-09", PropB = "bar", PropC = "banana" }
    monthlyResults[0][2] // { PropA = "2018-09", PropB = "baz", PropC = "apple" }
monthlyResults[1]
    monthlyResults[1][0] // { PropA = "2018-10", PropB = "quux", PropC = "banana" }
    monthlyResults[1][1] // { PropA = "2018-10", PropB = "qux", PropC = "cherry" }
    monthlyResults[1][2] // { PropA = "2018-10", PropB = "bar", PropC = "cherry" }
    monthlyResults[1][3] // { PropA = "2018-10", PropB = "foo", PropC = "apple" }

好消息是monthlyResults已经按我想要的属性-PropA进行了分组。但是,我希望能够首先获得PropC属性值的出现,以便我的结果看起来像这样:

firstOccurrences[0] // this would be for "2018-09"
    ["apple", "banana"]
firstOccurrences[1] // this would be for "2018-10"
    ["cherry"]

因此,在这种情况下,PropA的值为“ apple”的对象首先出现在“ 2018-09”组中。 “香蕉”也一样。其中“樱桃”首次出现在“ 2018-10”小组中。等等...

我一直在尝试:

monthlyResults.Select(g => g.GroupBy(r => r.PropA).Select(r => r.OrderBy(i => i.PropC).First()));

但是,当然,这只是在每个PropA分组中首次出现。我应该如何搜索整个monthlyResults集合,以首先出现PropC值的第一个出现的地方,并按PropA找到它们的位置分组?

2 个答案:

答案 0 :(得分:0)

System.Collections.Generic.HashSet<string> allFound = new HashSet<string>();

var results = monthlyResults
  // flatten the two d array
  .SelectMany(x => x)
  // select only items we have not seen before.
  .Where(x => { 
     if (allFound.Contains(x.PropC))
       return false; 
     else { 
       allFound.Add(x.PropC); 
       return true; 
     }
   });

答案 1 :(得分:0)

您也许可以通过以下方式实现它:

monthlyResults
    .SelectMany(monthlyResult => monthlyResult)
    .OrderBy(result => result.PropA)
    .GroupBy(result => result.PropC)
    .Select(propCGroup => propCGroup.First())
    .GroupBy(firstOccurence => firstOccurence.PropA);

不在 Visual Studio 前面,因此可能会有一些错别字,但是我认为它应该可以满足您的需求。

希望有帮助!