【发布时间】:2014-05-06 16:40:23
【问题描述】:
我有
List<Guid> id
我的字典:
manager.DriveTimes.Containskey(id)
我如何检查是否有任何 id 作为字典中的键存在。 我想在不针对 List id 使用 for 循环的情况下一次性签入。
任何建议
【问题讨论】:
我有
List<Guid> id
我的字典:
manager.DriveTimes.Containskey(id)
我如何检查是否有任何 id 作为字典中的键存在。 我想在不针对 List id 使用 for 循环的情况下一次性签入。
任何建议
【问题讨论】:
idList.Any(id => manager.DriveTimes.ContainsKey(id));
【讨论】:
ContainsKey的更好选择
您可以使用 System.Linq 中的 Intersect 扩展。
bool anyGuids = manager.DriveTimes.Keys.Intersect(id).Any()
【讨论】:
为了完整起见,这里有一些性能比较
List<Guid> listA = new List<Guid>();
for (int count = 0; count < 10000; count++)
{
listA.Add(Guid.NewGuid());
}
List<Guid> listB = new List<Guid>();
for (int count = 0; count < 10000; count++)
{
listB.Add(Guid.NewGuid());
}
// Match by Any without matches.
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
bool matchFound = listA.Any(item => listB.Contains(item));
sw.Stop();
Console.WriteLine("List Match {0}ms", sw.ElapsedMilliseconds);
System.Collections.Generic.Dictionary<Guid, string> dictA = new System.Collections.Generic.Dictionary<Guid, string>();
for (int count = 0; count < 10000; count++)
{
dictA.Add(Guid.NewGuid(),"");
}
// Match by Key without matches.
sw.Reset();
sw.Start();
matchFound = listB.Any(item => dictA.ContainsKey(item));
sw.Stop();
Console.WriteLine("Key Match {0}ms", sw.ElapsedMilliseconds);
这些给出结果
List Match 1095ms
Key Match 1ms
【讨论】: