C# GroupBy之后如何相交结果

C# GroupBy之后如何相交结果,c#,linq,C#,Linq,为了说明我的问题,我创建了这个简单的代码片段。我有一个类项目 public class Item { public int GroupID { get; set; } public int StrategyID { get; set; } public List<Item> SeedData() { return new List<Item> { new Item {GroupID

为了说明我的问题,我创建了这个简单的代码片段。我有一个类
项目

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 },
        };
    }
}
这很好,但其中一个问题是我丢失了
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();
请注意,在GROUPBY中使用字符串作为标识可能不是进行分组的最佳方法

关于“剪切”查询的问题,您还应该能够执行以下操作:

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

我不明白你在找什么。在您的示例中,没有两个paris的GroupID/StrategyID具有相同的值,但是对于第二个组,您的代码返回true。您好,您的第一个选项看起来不错,但是由于某些原因,即使存在重复对,
重复项
仍然为空。即使您通过在最后添加“.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
    }
}