2013-10-09 19 views
38

"Name"と "Id"の2つの文字列を持つDogというクラスがあるとします。さて、私たちに4匹の犬のリストがあるとしましょう。あなたが "2"の "Id"で犬の名前を変更したければ、それを行う最善の方法は何でしょうか?genericリストの要素を更新する最良の方法

Dog d1 = new Dog("Fluffy", "1"); 
Dog d2 = new Dog("Rex", "2"); 
Dog d3 = new Dog("Luna", "3"); 
Dog d4 = new Dog("Willie", "4"); 

List<Dog> AllDogs = new List<Dog>() 
AllDogs.Add(d1); 
AllDogs.Add(d2); 
AllDogs.Add(d3); 
AllDogs.Add(d4); 
+0

非常に多くの方法があります。 *ベストを決める*? –

+0

@SriramSakthivel私はそれが問題だと思いましたか? – TheGeekZn

+0

@SemiDementedベストセラー?何がベスト?パフォーマンス?記憶?メンテナンス?簡潔ですか?または何?最も良いというのは、あなたが具体的でなければならないということです。 –

答えて

74
AllDogs.Where(d => d.Id == "2").First().Name = "some value"; 

しかし、それのより安全なバージョンは、このようになります。リードは述べたように、私たちはここにFirstあるいはFirstOrDefaultに直接行くことができます

var dog = AllDogs.Where(d => d.Id == "2").FirstOrDefault(); 
if (dog != null) { dog.Name = "some value"; } 

AllDogs.First(d => d.Id == "2").Name = "some value"; 

または

var dog = AllDogs.FirstOrDefault(d => d.Id == "2"); 
あなたが行うことができ
+11

あなたは 'AllDogs.First(d => d.Id ==" 2 ")でもできることに注意してくださいName =' ... –

+0

@ReedCopsey、ありがとうございます。それを得るためのより簡潔な方法! –

+3

これは、更新するプロパティが1つある場合に機能します。多くのプロパティがあり、リスト内のオブジェクト全体を新しいものに置き換える場合はどうなりますか? – user20358

3

var matchingDog = AllDogs.FirstOrDefault(dog => dog.Id == "2")); 

これはnullを返します。そうでないと、マッチング犬を返します。以下のように

あなたは、プロパティを設定することができます。

if (matchingDog != null) 
    matchingDog.Name = "New Dog Name"; 
+6

'FirstOrDefault'はここではあまり役に立ちません。 "default"を返すと、 'Name'を設定しようとすると' NullReferenceException'が発生します... –

0

をリストがソートされている場合(例にあるように起こるように)インデックスのバイナリ検索は確かに動作します。

public static Dog Find(List<Dog> AllDogs, string Id) 
    { 
     int p = 0; 
     int n = AllDogs.Count; 
     while (true) 
     { 
      int m = (n + p)/2; 
      Dog d = AllDogs[m]; 
      int r = string.Compare(Id, d.Id); 
      if (r == 0) 
       return d; 
      if (m == p) 
       return null; 
      if (r < 0) 
       n = m; 
      if (r > 0) 
       p = m; 
     } 
    } 

これはLINQのバージョンがわかりません。

関連する問題