我有一个List<BuildingStatus>
称为buildingStatus
。 我想检查它是否包含状态,其字符代码(由返回GetCharCode()
等于某个变量, v.Status
。
是否有这样做的一些方法,沿下方的(非编译)代码的行?
buildingStatus.Contains(item => item.GetCharValue() == v.Status)
我有一个List<BuildingStatus>
称为buildingStatus
。 我想检查它是否包含状态,其字符代码(由返回GetCharCode()
等于某个变量, v.Status
。
是否有这样做的一些方法,沿下方的(非编译)代码的行?
buildingStatus.Contains(item => item.GetCharValue() == v.Status)
使用Any()
而不是Contains()
buildingStatus.Any(item => item.GetCharValue() == v.Status)
LINQ的扩展方法的任何可能为你工作?
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的一个转换为另一种,但我不知道它是如何高效; 它可能只是在后台创建一个列表。
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)
和跳过创建List<string>
与ConvertAll ()
开头。
这里是你如何使用Contains
实现你想要什么:
buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status)
这将返回一个布尔值。
如果我理解正确的话,你需要转换在建筑列表,您在buildingStatus列表存储类型(ENUM)存储类型(char值)。
(在建筑列表//字符值//每个状态,不存在于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;
}