检查包含其值的对象的字典是否包含两个具有相同属性的对象

时间:2019-06-02 10:07:51

标签: c# linq

我的问题不是重复的,因为您标记的问题是搜索List,而我正尝试搜索Dictionary

我有一个Dictionary<string, Player>

Player是具有属性GameID, Index及其他属性的对象。我的词典密钥是玩家的index。我想检查字典中是否包含两个Player和相同的GameIDindex会有所不同)。一种实现方法是在字典值上使用foreach进行迭代,并使用一个变量,该变量将在每次遇到特定GameID时递增。但是我想知道是否可以使用linq来做到这一点?如果有的话,该解决方案可能会更好。

3 个答案:

答案 0 :(得分:2)

词典与列表不同,提供访问其条目之一的复杂性。

u1的目的是映射一个键->值关系,其中键是唯一的。通过将通用索引用作键,与Follow相比没有任何优势。

因此,我将提供一个更有效地解决原始问题的方法,而不是回答效率低下的提法问题。

您可以找到Multimap(具有多个键的字典)的实现,可以在其中表示followers关系并计算发生次数,请在此处: multimap in .NET

与(当前)已接受的答案相比,它具有线性时间复杂度(O(N)),并且对于较大的Dictionary或List来说变得越来越差,即使使用Linq中的IQueryable进行了优化,这也提供了恒定的复杂度。 / p>

答案 1 :(得分:0)

使用LINQ的GroupBy,然后过滤大于一个的组:

var result = dict.Values
             .GroupBy(x => x.GameID)
             .Where(x => x.Count() > 1)
             .Select(g => g.First()); // Take one of the duplicates

Example


如果您知道要寻找的GameID,就可以使用

var gameID = 1
var isDuplicate = dict.Values
                  .Where(x => x.GameID == gameID)
                  .Count() > 1;

答案 2 :(得分:0)

假设我们有以下记录:

    Dictionary<string, Player> myDic = new Dictionary<string, Player>();
    Player p1 = new Player() { GameID = 1, Index = "a" };
    Player p2 = new Player() { GameID = 2, Index = "b" };
    Player p3 = new Player() { GameID = 1, Index = "c" };
    Player p4 = new Player() { GameID = 3, Index = "d" };
    myDic.Add(p1.Index, p1);
    myDic.Add(p2.Index, p2);
    myDic.Add(p3.Index, p3);
    myDic.Add(p4.Index, p4);

您可以尝试以下方法:

 var duplicates = myDic.Values
                .GroupBy(x => x.GameID)
                .SelectMany(p =>
                    p.Select((j, i) => new { j.Index, j.GameID, rn = i + 1 }))
                .Where(x => x.rn > 1).ToList();

            foreach (var dups in duplicates)
            {
                Console.WriteLine($"record with GameId: {dups.GameID} at Index: {dups.Index} is duplicate!");
            }