如何在GroupBy之后交叉结果

时间:2016-02-21 13:04:36

标签: c# linq

为了说明我的问题,我创建了这个简单的代码段。我有一个班级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)

并以某种方式对此结果进行检查?

2 个答案:

答案 0 :(得分:0)

一种非常简单的方法是使用物品的某些身份进行分组。您可以为Item重写Equals / GetHashCode,或者编写类似:

的内容
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();

请注意,在group by中使用字符串进行标识可能不是进行分组的最佳方式。

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

 <item
      android:id="@+id/action_settings"
      android:title="@string/action_settings"
      android:orderInCategory="100"
      app:showAsAction="never" />

答案 1 :(得分:0)

您可以采用另一种方式,如下所示:

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