buildingStatus
というList<BuildingStatus>
があります。 v.Status
という変数に等しいcharコード(GetCharCode()
によって返される)のステータスが含まれているかどうかを確認したいと思います。
以下の(非コンパイル)コードの行に沿って、これを行う方法はありますか?
buildingStatus.Contains(item => item.GetCharValue() == v.Status)
Any()
の代わりに Contains()
を使用します。
buildingStatus.Any(item => item.GetCharValue() == v.Status)
Linq拡張メソッドAnyはあなたのために働くことができます...
buildingStatus.Any(item => item.GetCharValue() == v.Status)
何を探しているのか正確にはわかりませんが、このプログラム:
public class Building
{
public enum StatusType
{
open,
closed,
weird,
};
public string Name { get; set; }
public StatusType Status { get; set; }
}
public static List <Building> buildingList = new List<Building> ()
{
new Building () { Name = "one", Status = Building.StatusType.open },
new Building () { Name = "two", Status = Building.StatusType.closed },
new Building () { Name = "three", Status = Building.StatusType.weird },
new Building () { Name = "four", Status = Building.StatusType.open },
new Building () { Name = "five", Status = Building.StatusType.closed },
new Building () { Name = "six", Status = Building.StatusType.weird },
};
static void Main (string [] args)
{
var statusList = new List<Building.StatusType> () { Building.StatusType.open, Building.StatusType.closed };
var q = from building in buildingList
where statusList.Contains (building.Status)
select building;
foreach ( var b in q )
Console.WriteLine ("{0}: {1}", b.Name, b.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 ();
}
ある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>
を作成することをスキップします。
Contains
を使用して、目的を達成する方法を次に示します。
buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status)
これはブール値を返します。