Tôi không chắc chắn chính xác những gì bạn' đang tìm kiếm, nhưng chương trình này:
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);
}
sản xuất sản lượng dự kiến:
one: open
two: closed
four: open
five: closed
chương trình này so sánh một chuỗi đại diện của enum và sản xuất cùng một sản lượng:
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();
}
Tôi tạo ra phương pháp mở rộng này để chuyển đổi một IEnumerable khác, nhưng tôi không chắc nó hiệu quả như thế nào; nó chỉ có thể tạo ra một danh sách đằng sau hậu trường.
public static IEnumerable <TResult> ConvertEach (IEnumerable <TSource> sources, Func <TSource,TResult> convert)
{
foreach (TSource source in sources)
yield return convert (source);
}
Sau đó, bạn có thể thay đổi mệnh đề where to:
where statusList.ConvertEach <string> (status => status.GetCharValue()).
Contains (v.Status)
và bỏ qua việc tạo ra các List<string>
với ConvertAll()
lúc đầu.
Tốt. Tôi cứ tự hỏi tại sao Earth Linq lại không cung cấp phương thức 'Contains()', và sau đó tôi nhận ra nó được cho là 'Any() 'thay thế. +1 – Nolonar