답변:
정확히 무엇을 찾고 있는지 잘 모르겠지만이 프로그램은 다음과 같습니다.
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)
와 List<string>
함께 만들기를 건너 뛰십시오ConvertAll ()
시작 부분에서 .
올바르게 이해하면 건물 목록에 저장하는 유형 (문자 값)을 buildingStatus 목록에 저장하는 유형 (열)으로 변환해야합니다.
(Building list // character value //의 각 상태에 대해 buildingStatus list // enum value //에 상태가 있습니까?)
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;
}
Building
에서 모든 참조를 제거 하여이 답변을 약간 무효화 했지만 실제로 는 실제로 고장 났습니다 . foreach(Enum value in Enum.GetValues(typeof(buildingStatus)))
말도 안됩니다.
Contains()
방법을 제공하지 않는지 계속 궁금해 하며Any()
대신 그 방법이 필요하다는 것을 깨달았습니다 . +1