2009-10-14 10 views
121

buildingStatusです。私は、それが文字コード(GetCharCode()によって返される)がいくつかの変数、v.Statusと等しいステータスを含んでいるかどうかチェックしたいと思います。LINQ: "contains"とラムダクエリ

以下の(非コンパイル)コードの行に沿って、これを実行する方法はありますか?

buildingStatus.Contains(item => item.GetCharValue() == v.Status) 

答えて

232

代わりContains()の使用Any()

buildingStatus.Any(item => item.GetCharValue() == v.Status) 
+6

ニース。私はなぜ地球のLinqが 'Contains()'メソッドを提供していないのか疑問に思っています。そして、代わりに 'Any()'であるはずです。 +1 – Nolonar

30

どれがあなたのために仕事ができるのLINQの拡張メソッド...

buildingStatus.Any(item => item.GetCharValue() == v.Status) 
3

私は正確に何を」わからないんだけど探しているが、このプログラム:

このプログラムは、列挙型の文字列表現を比較し、同じ出力を生成し

one: open 
two: closed 
four: open 
five: closed 

が期待される出力を生成し

public class Building 
    { 
     public enum StatusType 
     { 
      open, 
      closed, 
      weird, 
     }; 

     public string Name { get; set; } 
     public string Status { get; set; } 
    } 

    public static List <Building> buildingList = new List<Building>() 
    { 
     new Building() { Name = "one", Status = "open" }, 
     new Building() { Name = "two", Status = "closed" }, 
     new Building() { Name = "three", Status = "weird" }, 

     new Building() { Name = "four", Status = "open" }, 
     new Building() { Name = "five", Status = "closed" }, 
     new Building() { Name = "six", Status = "weird" }, 
    }; 

    static void Main (string [] args) 
    { 
     var statusList = new List<Building.StatusType>() { Building.StatusType.open, Building.StatusType.closed }; 
     var statusStringList = statusList.ConvertAll <string> (st => st.ToString()); 

     var q = from building in buildingList 
       where statusStringList.Contains (building.Status) 
       select building; 

     foreach (var b in q) 
      Console.WriteLine ("{0}: {1}", b.Name, b.Status); 

     Console.ReadKey(); 
    } 

私がこの拡張メソッドを作成しました1つのIEnumerableを別のIEnumerableに変換しますが、効率的であるかどうかはわかりません。それはちょうど場面の裏にリストを作成するかもしれない。

public static IEnumerable <TResult> ConvertEach (IEnumerable <TSource> sources, Func <TSource,TResult> convert) 
{ 
    foreach (TSource source in sources) 
     yield return convert (source); 
} 

次に、あなたがにwhere句を変更することができます。

where statusList.ConvertEach <string> (status => status.GetCharValue()). 
    Contains (v.Status) 

と冒頭でConvertAll()List<string>を作成スキップします。

+0

ありがとうございましたlarryがうまくいきました、ここであなたのコードを参照して何をしたのですか?しかし、新しいリストを作成する必要がなければ、可能ならいいと思いますか? // ILISTのためにToListを使用し、GetCharValueを実行します //これは、文字の で新しいリストを生成します。var statusStringList = building.ToList()。ConvertAll (st => st。GetCharValue()); var test = from qry ここで、statusStringList.Contains(v.Status) select v; 新しいリストを作成したり、Contains内のラムダを使用したりする必要がないのはうれしいですが、その不可能と思われますか? –

+0

statusプロパティが文字列であると仮定します。したがって、各比較のステータス列挙を文字列に変換する必要があります。あなたは最初にそれらを一度変換し、それで終わらせるかもしれません。 – XXXXX

+0

私は質問を大幅に簡素化する編集を行ったが、そうすることでsort-of-invalidはこの答えを無効にする。申し訳ありませんが、私はそれがより良い全体的なものであると考えました。 –

-1

私が正しく理解していれば、建物リストの をタイプする(char値)をbuildingStatusリストに格納するタイプ(列挙型)に変換する必要があります。

(ビル・リスト内の各ステータスについては、//文字値//、 はステータスがbuildingStatusリストに//列挙値を//存在しません)

public static IQueryable<Building> WithStatus(this IQueryable<Building> qry, 
     IList<BuildingStatuses> buildingStatus) 
    { 
     return from v in qry 
       where ContainsStatus(v.Status) 
       select v;   
    } 


private bool ContainsStatus(v.Status) 
{ 
foreach(Enum value in Enum.GetValues(typeof(buildingStatus))) 
{ 
    If v.Status == value.GetCharValue(); 
    return true; 
} 
return false; 
} 
+0

-1;質問への私の編集は質問から 'Building'へのすべての参照を取り除くことによってこの答えを少し無効にしましたが、これはすでに*本当に壊れていました*。 'foreach(Enum.GetValues(typeof(buildingStatus))のEnum値))'はナンセンスです。 –

0

ここでは、あなたがContainsを使用する方法であります

buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status)これはブール値を返します。

関連する問題