LINQ : "포함"및 Lambda 쿼리
나는 한 List<BuildingStatus>
이라고 buildingStatus
. char 코드 (로 반환 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을 다른 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)
and skip creating the List<string>
with ConvertAll ()
at the beginning.
Here is how you can use Contains
to achieve what you want:
buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status)
this will return a Boolean value.
If I understand correctly, you need to convert the type (char value) that you store in Building list to the type (enum) that you store in buildingStatus list.
(For each status in the Building list//character value//, does the status exists in the 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;
}
참고URL : https://stackoverflow.com/questions/1566439/linq-contains-and-a-lambda-query
'IT박스' 카테고리의 다른 글
공백이 아닌 단일 문자와 일치하는 정규식 (0) | 2020.06.07 |
---|---|
Rails 및 PostgreSQL에서 시간대를 모두 무시 (0) | 2020.06.07 |
파이썬에서 포착되지 않은 예외 로깅 (0) | 2020.06.07 |
안드로이드 자바; (0) | 2020.06.07 |
R 스크립트에서 전체적으로 경고를 표시하지 않는 방법 (0) | 2020.06.07 |