列表<MyObject>包含

SF *_*per 2 c# linq

检查列表中是否存在一个条目的最快方式(编码方式)是什么?MyObject有2个属性

public class Name
{
    public string FirstName{ get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我有另一个这样的课:

public class Foo
{ 
   private  List<Name> Names : new List<Name>();
   public List<Name> Names { get; set; }

   public bool Contains(Name x)
   {
      if (x == null)
         return false;

      >>> Navigate || Equals || Linq.Contains
      >>> What's the easiest way to do this?
   }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ler 5

最快的列表是O(n)查找速度和O(1)插入速度:

最后一个

Names.Any(n=> x.FirstName == n.FirstName && x.LastName == n.LastName)

正好一个:

Names.Count(n=> x.FirstName == n.FirstName && x.LastName == n.LastName) == 1

Any()更快,因为它在找到Name的第一个实例时会短路.Count每次搜索列表以查找Name的所有实例.

相反,您可以使用查找操作所在的集合(例如HashSet,Dictionary等)O(1).但是,集合不具有与列表相同的属性.请注意,Hashset<string>名称存储的位置FirstName + (delimeter) + LastName比您拥有的任何其他选项更快.

您还可以使用查找速度为的SortedListO(log(n)).但是,在排序列表中插入元素是O(nlog(n))因为必须在每次插入后对列表进行排序.