我的问题不是重复的,因为您标记的问题是搜索List
,而我正尝试搜索Dictionary
。
我有一个Dictionary<string, Player>
。
Player
是具有属性GameID, Index
及其他属性的对象。我的词典密钥是玩家的index
。我想检查字典中是否包含两个Player
和相同的GameID
(index
会有所不同)。一种实现方法是在字典值上使用foreach
进行迭代,并使用一个变量,该变量将在每次遇到特定GameID
时递增。但是我想知道是否可以使用linq
来做到这一点?如果有的话,该解决方案可能会更好。
答案 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
如果您知道要寻找的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!");
}