はbuildingStatus
です。私は、それが文字コード(GetCharCode()
によって返される)がいくつかの変数、v.Status
と等しいステータスを含んでいるかどうかチェックしたいと思います。LINQ: "contains"とラムダクエリ
以下の(非コンパイル)コードの行に沿って、これを実行する方法はありますか?
buildingStatus.Contains(item => item.GetCharValue() == v.Status)
はbuildingStatus
です。私は、それが文字コード(GetCharCode()
によって返される)がいくつかの変数、v.Status
と等しいステータスを含んでいるかどうかチェックしたいと思います。LINQ: "contains"とラムダクエリ
以下の(非コンパイル)コードの行に沿って、これを実行する方法はありますか?
buildingStatus.Contains(item => item.GetCharValue() == v.Status)
代わりContains()
の使用Any()
:
buildingStatus.Any(item => item.GetCharValue() == v.Status)
どれがあなたのために仕事ができるのLINQの拡張メソッド...
buildingStatus.Any(item => item.GetCharValue() == v.Status)
私は正確に何を」わからないんだけど探しているが、このプログラム:
このプログラムは、列挙型の文字列表現を比較し、同じ出力を生成し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>
を作成スキップします。
ありがとうございましたlarryがうまくいきました、ここであなたのコードを参照して何をしたのですか?しかし、新しいリストを作成する必要がなければ、可能ならいいと思いますか? // ILISTのためにToListを使用し、GetCharValueを実行します //これは、文字の で新しいリストを生成します。var statusStringList = building.ToList()。ConvertAll
statusプロパティが文字列であると仮定します。したがって、各比較のステータス列挙を文字列に変換する必要があります。あなたは最初にそれらを一度変換し、それで終わらせるかもしれません。 – XXXXX
私は質問を大幅に簡素化する編集を行ったが、そうすることでsort-of-invalidはこの答えを無効にする。申し訳ありませんが、私はそれがより良い全体的なものであると考えました。 –
私が正しく理解していれば、建物リストの をタイプする(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;
}
-1;質問への私の編集は質問から 'Building'へのすべての参照を取り除くことによってこの答えを少し無効にしましたが、これはすでに*本当に壊れていました*。 'foreach(Enum.GetValues(typeof(buildingStatus))のEnum値))'はナンセンスです。 –
ここでは、あなたがContains
を使用する方法であります
buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status)
これはブール値を返します。
ニース。私はなぜ地球のLinqが 'Contains()'メソッドを提供していないのか疑問に思っています。そして、代わりに 'Any()'であるはずです。 +1 – Nolonar