2011-10-26 21 views
3

を使用して、リスト内の要素の検索簡素化I、次のコードを持っている:私が知りたいのですがどのようなは、おそらくLINQ

class TestClass 
{ 
    public string StringValue { 
     get; set; 
    } 
    public int IntValue { 
     get; set; 
    } 
} 

class MainClass 
{ 
    private readonly List<TestClass> MyList; 

    public MainClass() 
    { 
     MyList = new List<TestClass>(); 
    } 

    public void RemoveTestClass(string strValue) 
    { 
     int ndx = 0; 

     while (ndx < MyList.Count) 
     { 
      if (MyList[ndx].StringValue.Equals(strValue)) 
       break; 
      ndx++; 
     } 
     MyList.RemoveAt(ndx); 
    } 

    public void RemoveTestClass(int intValue) 
    { 
     int ndx = 0; 

     while (ndx < MyList.Count) 
     { 
      if (MyList[ndx].IntValue == intValue) 
       break; 
      ndx++; 
     } 
     MyList.RemoveAt(ndx); 
    } 
} 

おそらくwhileループを置き換えるために、LINQを使用して、簡単な方法があればあります私はやっているように、各要素を反復するのではなく、2つのRemoveTestClassの関数で?

答えて

6

あなたはList<T>.FindIndexを使用することができます。

myList.RemoveAt(MyList.FindIndex(x => x.StringValue == strValue)); 

あなたはまた、要素が見つからなかった場合に処理することもできます。

int i = myList.FindIndex(x => x.StringValue == strValue); 
if (i != -1) 
{ 
    myList.RemoveAt(i); 
} 
+0

[List.Remove](http://msdn.microsoft.com/en-us/library/cd666k3e%28v=VS.100%29.aspx)と 'List.Find'では' List.FindIndex'あなたはできませんでしたか? –

+0

@TimSchmelterしかし、一致するアイテムが見つからない場合、findはexecptionをスローします。 – Fischermaen

+0

@Fischermaen:しかし、@Markは 'i = -1'の場合を扱っています。 'List.Find'が' null'である場合も処理できます。 –

2

を私はそのようにそれを行うだろう:

public void RemoveTestClass(string strValue) 
{ 
    MyList.RemoveAll(item => item.StringValue.Equals(strValue)); 
} 

と:

public void RemoveTestClass(int intValue) 
{ 
    MyList.RemoveAll(item => item.IntValue == intValue); 
} 

更新:

あなただけの最初れる発生を削除する場合:私は考えることができます

public void RemoveTestClass(int intValue) 
{ 
    var itemToRemove = MyList.FirstOrDefault(item => item.InValue == intValue); 
    if (itemToRemove != null) 
    { 
     MyList.Remove(itemToRemove); 
    } 
}  
+3

RemoveAllは、最初のアイテムだけでなく、すべてのアイテムを削除します。 –

+0

@マークバイヤーあなたはそうです。サンプルを修正しました。 – Fischermaen

3

最も簡単な方法は、基準に一致する最初の項目を、発見してから行うようにList.Removeを使用していますそれは:それはアイテムを見つけることができないとき

myList.Remove(myList.FirstorDefault(x=>x.StringValue == stringValue)) 

Removeので、上記正常に動作し、例外をスローしません。あなたがリストにnull値を持つことを許していることを除いて、それは削除されます。リストに入れておくのはそれほどうまくありません。

関連する問題