2

リストに 1 つのエントリが存在するかどうかを確認する最も速い方法 (コーディングに関して) は何ですか? MyObject には 2 つのプロパティがあります

public class Name
{
    public string FirstName{ get; set; }
    public string LastName { get; set; }
}

次に、次のような別のクラスがあります。

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?
   }
}
4

4 に答える 4

5

リストの最速は、O(n)検索速度とO(1)挿入速度です。

少なくとも一つの

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

1 つだけ:

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

Any() は、Name の最初のインスタンスが見つかったときに短絡するため、高速です。Name のすべてのインスタンスを見つけるために、リストを毎回検索します。

代わりに、ルックアップ操作が行われるCollection (例: HashSetDictionaryなど)を使用できますO(1)。ただし、コレクションはリストと同じプロパティを保持しません。名前Hashset<string>が次のようなものとして保存される場所はFirstName + (delimeter) + LastName、他のどのオプションよりも高速です。

ルックアップ速度がO(log(n)). ただし、ソートされたリストに要素を挿入するのは、挿入するO(nlog(n))たびにリストをソートしたままにしておく必要があるためです。

于 2013-04-30T03:19:49.953 に答える
1

私は linq と言うでしょう

Names.Any(n=> n==x)
于 2013-04-30T03:20:16.130 に答える
1

を使用Linqすると読みやすくなります。を使ったサンプルAnyです。

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

        return this.Names.Any(item => item.FirstName == x.FirstName && item.LastName == x.LastName);
    }

提案:あなたのアイテムlistがユニークであると思われる場合は、使用System.Collections.Generic.HashSetして使用できますSystem.Linq.Enumerable.Contains..

于 2013-04-30T03:21:10.813 に答える