No estoy seguro exactamente lo que' está buscando, pero este programa:
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);
}
produce la salida esperada:
one: open
two: closed
four: open
five: closed
Este programa compara una representación de cadena de la enumeración y produce la misma salida:
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();
}
he creado este método de extensión de convertir un IEnumerable en otro, pero no estoy seguro de lo eficiente que es; puede simplemente crear una lista detrás de escena.
public static IEnumerable <TResult> ConvertEach (IEnumerable <TSource> sources, Func <TSource,TResult> convert)
{
foreach (TSource source in sources)
yield return convert (source);
}
A continuación, puede cambiar la cláusula dónde:
where statusList.ConvertEach <string> (status => status.GetCharValue()).
Contains (v.Status)
y omitir la creación de la List<string>
con ConvertAll()
al principio.
Agradable. Me sigo preguntando por qué en Earth Linq no proporciona un método 'Contains()', y luego me doy cuenta de que se supone que es 'Any()' en su lugar. +1 – Nolonar