我正在尝试首先按特定属性分组的值的第一次出现。
我有一个列表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
找到它们的位置分组?
答案 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 前面,因此可能会有一些错别字,但是我认为它应该可以满足您的需求。
希望有帮助!