如何在分组后与结果相交
本文关键字:结果 | 更新日期: 2023-09-27 18:35:31
为了说明我的问题,我创建了这个简单的片段。我有一个班级Item
public class Item
{
public int GroupID { get; set; }
public int StrategyID { get; set; }
public List<Item> SeedData()
{
return new List<Item>
{
new Item {GroupID = 1, StrategyID = 1 },
new Item {GroupID = 2, StrategyID = 1 },
new Item {GroupID = 3, StrategyID = 2 },
new Item {GroupID = 4, StrategyID = 2 },
new Item {GroupID = 5, StrategyID = 3 },
new Item {GroupID = 1, StrategyID = 3 },
};
}
}
我想检查的是这个SeedData
方法没有返回任何重复的GroupID/StrategyID
对。
所以在我的Main
方法中,我有这个:
Item item = new Item();
var data = item.SeedData();
var groupByStrategyIdData = data.GroupBy(g => g.StrategyID).Select(v => v.Select(gr => gr.GroupID)).ToList();
for (var i = 0; i < groupByStrategyIdData.Count; i++)
{
for (var j = i + 1; j < groupByStrategyIdData.Count; j++)
{
Console.WriteLine(groupByStrategyIdData[i].Intersect(groupByStrategyIdData[j]).Any());
}
}
工作正常,但问题之一是我已经丢失了StrategyID
所以在我的真实情况下,我将无法说出我有重复的StrategyID/GroupID
对,所以我想知道是否可以切断LINQ
到这里:
var groupByStrategyIdData = data.GroupBy(g => g.StrategyID)
并以某种方式对此结果进行检查?
一种非常简单的方法是使用项目的某些标识进行分组。您可以覆盖项目的 Equals/GetHashCode,或者编写类似以下内容的内容:
Item item = new Item();
var data = item.SeedData();
var duplicates = data.GroupBy(x => string.Format("{0}-{1}", x.GroupID, x.StrategyID))
.Where(group => group.Count() > 1)
.Select(group => group.Key)
.ToList();
请注意,在分组依据中使用字符串作为标识可能不是进行分组的最佳方式。
对于有关"剪切"查询的问题,您还应该能够执行以下操作:
var groupQuery = data.GroupBy(g => g.StrategyID);
var groupList = groupQuery.Select(grp => grp.ToList()).ToList();
var groupByStrategyIdData = groupQuery.Select(v => v.Select(gr => gr.GroupID)).ToList();
你可以用另一种方式来做,如下所示:
// Check for duplicates
if (data != null)
{
var grp =
data.GroupBy(
g =>
new
{
g.GroupID,
g.StrategyID
},
(key, group) => new
{
GroupID = key.GroupID,
StrategyId = key.StrategyID,
Count = group.Count()
});
if (grp.Any(c => c.Count > 1))
{
Console.WriteLine("Duplicate exists");
// inside the grp object, you can find which GroupID/StrategyID combo have a count > 1
}
}