J'ai un List<BuildingStatus>
appelé buildingStatus
. Je voudrais vérifier s'il contient un statut dont le code de caractère (renvoyé par GetCharCode()
) est égal à une variable, v.Status
.
Y a-t-il un moyen de le faire, à l'instar du code (non compilant) ci-dessous?
buildingStatus.Contains(item => item.GetCharValue() == v.Status)
Utilisez Any()
au lieu de Contains()
:
buildingStatus.Any(item => item.GetCharValue() == v.Status)
La méthode d'extension Linq Any pourrait fonctionner pour vous ...
buildingStatus.Any(item => item.GetCharValue() == v.Status)
Je ne sais pas exactement ce que vous recherchez, mais ce programme:
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);
}
produit le résultat attendu:
one: open
two: closed
four: open
five: closed
Ce programme compare une représentation sous forme de chaîne de l'énum et produit le même résultat:
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 ();
}
J'ai créé cette méthode d'extension pour convertir un IEnumerable en un autre, mais je ne suis pas certain de son efficacité. il peut simplement créer une liste dans les coulisses.
public static IEnumerable <TResult> ConvertEach (IEnumerable <TSource> sources, Func <TSource,TResult> convert)
{
foreach ( TSource source in sources )
yield return convert (source);
}
Ensuite, vous pouvez modifier la clause where en:
where statusList.ConvertEach <string> (status => status.GetCharValue()).
Contains (v.Status)
et sautez la création du List<string>
avec ConvertAll ()
au début.
Voici comment utiliser Contains
pour obtenir ce que vous voulez:
buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status)
cela retournera une valeur booléenne.