2012-04-07 6 views
1

私は、カスタム型。(入って)異なるタイプの

List<MyType> list = new List<MyType>(); 

の一般的な-EDのリストを持っているあなたは、文字列を比較する場合、それが動作するように、私はがMyTypeの.Equalsを上書きしましたMyTypeを入力します。私の質問は、 - リストにMyTypeのみが含まれている場合、List.Contains(文字列)を使用する方法がありますか?

私はそれを行うことができます(MyTypeオブジェクトをそこに作成し、文字列の代わりに作成するなど)がありますが、リストを拡張する必要はありません。

+0

を単に好奇心:なぜあなたはそれが必要なのですか? – Tigran

+0

私は一度文字列のリストを代わりに使用していたコードをリファクタリングしています。大量のコードを分割する必要はありません。 – Haedrian

答えて

8

使用LINQ:

bool hasSugar = list.Any(i => i.Equals("sugar")); 
+0

質問が 'Contains'にあった – Tigran

+0

ええと、これはかなり簡単にうまくいくようです。同様の方法で「削除」を使用することはできますか?私はlinqを使ったことは一度もありません。 – Haedrian

+0

@Tigran:はい、私は問題が 'Contains'だと知っていますが、linqs Anyは回避策が組み込まれているので、私はそれを提案しました。 –

3

Haedrian、

LINQのは、あなたのためにこれを解決してもらえますか?下の私の例では、「MyType」は整数のリストですが、文字列値に「Contains」を実行してフィルタリングされたリストを取得できます。

using System.Collections.Generic; 
using System.Linq; 

List<int> list = new List<int>(); 

List<int> sList = (from s in list 
where s.ToString().Contains("1") 
select s).ToList(); 

私は役に立つと思います。 Linqの例を検索する必要があります。非常に強力です。

+0

Errr、投稿前にこのウィンドウを「編集」していました。これでAndersの例に何も追加されない場合は、ごめんなさい! –

0

カスタムタイプのインターフェイスを実装している場合、ContainsはカスタムIEquatableで使用できます。特定のタイプのために、一般的なIEquatableインターフェイスを実装することもできます。それらは両方ともユニークのIDを持つことができます。あなたがIEquatableを使用することができます。この場合、実装体で :

class MyType1 : IEquatable<int> 

bool IEqutabale<int>.Equals(int other) 
{ 
    if (Id == other) return true; 
    return false; 
} 

、あなたのように比較することができますが、以下:

if (Type1List.Cast<IEquatable<int>>().Contains(type2Obj.Id) 
{ 
    //write your code here 
} 

あなたの他のオプションは、両方のタイプの間直接平等を実現することです。 はつまり、次のように

class MyType1 : IEquatable<MyType2> 

bool IEquatable<MyType2>.IEquals(MyType2 other) 
{ 
    //write equality logic here 
} 

次に、あなたが比較することができます:

if(Type1List.Cast<IEquatable<MyType2>>().Contains(type2Object)) 
{ 
    //write your code here 
} 
関連する問題