簡體   English   中英

GroupBy之后如何相交結果

[英]How to intersect results after GroupBy

為了說明我的問題,我創建了這個簡單的代碼段。 我有一個類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)

並以某種方式對此結果進行檢查?

一種非常簡單的方法是使用商品的某些標識進行分組。 您可以覆蓋Item的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();

請注意,在group by中使用字符串作為標識可能不是最好的分組方法。

關於“剪切”查詢的問題,您還應該能夠執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM