我有一个情况,我必须找出元素是否属于列表或不在循环中。
执行此操作的直接方法是调用列表的
Any
方法,如下所示
public class Person
{
public int Id { get; set;}
public string Name { get; set;}
}
List<Person> persons = new List<Person>();
foreach(int personId in personIds)
{
if(persons.Any(x => x.Id == personId))
{
// do something
}
}
我看到开发人员使用的另一种方法是使用
Dictionary
并调用其 TryGetValue
方法,就像这样
Dictionary<int, Person> personLookup = new Dictionary<int, Person>();
foreach(int personId in personIds)
{
if(personLookup.TryGetValue(personId, out var person))
{
// do something
}
}
两者哪个效率更高?
当您使用 List.Any 时 - 它会搜索集合以查找元素。所以这种搜索的复杂度是O(n)。 如果您使用字典,那么它使用 O(1) 搜索和访问每个特定元素的时间 - 所以它会快得多。