LINQ: "포함" 및 람다 쿼리
나는 있습니다List<BuildingStatus>
불렀다buildingStatus
문자 코드(반품자)의 상태가 포함되어 있는지 확인하고 싶습니다.GetCharCode()
)는 어떤 변수와 같습니다.v.Status
.
아래의 (비컴파일링) 코드에 따라 이 작업을 수행할 수 있는 방법이 있습니까?
buildingStatus.Contains(item => item.GetCharValue() == v.Status)
대신 사용Contains()
:
buildingStatus.Any(item => item.GetCharValue() == v.Status)
Linq 확장 방법 Any는 당신에게 도움이 될 수 있습니다...
buildingStatus.Any(item => item.GetCharValue() == v.Status)
사용 방법은 다음과 같습니다.Contains
원하는 것을 달성하기 위해:
buildingStatus.Select(item => item.GetCharValue()).Contains(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 ();
}
하나의 IE 숫자를 다른 IE 숫자로 변환하기 위해 이 확장 방법을 만들었지만 얼마나 효율적인지는 잘 모르겠습니다. 단지 뒤에 목록을 만들 수도 있습니다.
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 ()
처음에
var depthead = (from s in db.M_Users
join m in db.M_User_Types on s.F_User_Type equals m.UserType_Id
where m.UserType_Name.ToUpper().Trim().Contains("DEPARTMENT HEAD")
select new {s.FullName,s.F_User_Type,s.userId,s.UserCode }
).OrderBy(d => d.userId).ToList();
Model.AvailableDeptHead.Add(new SelectListItem { Text = "Select", Value = "0" });
for (int i = 0; i < depthead.Count; i++)
Model.AvailableDeptHead.Add(new SelectListItem { Text = depthead[i].UserCode + " - " + depthead[i].FullName, Value = Convert.ToString(depthead[i].userId) });
내가 올바르게 이해했다면, 당신은 Building 목록에 저장하는 유형(문자 값)을 Building Status 목록에 저장하는 유형(enum)으로 변환해야 합니다.
(Building 목록의 각 상태에 대해//문자 값//, 상태가 Building Status 목록에 존재합니까//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
'bestsource' 카테고리의 다른 글
목표-CARC: 강함 vs 유지, 약함 vs 할당 (0) | 2023.05.14 |
---|---|
Windows에서 diff 명령어에 해당하는 것은 무엇입니까? (0) | 2023.05.14 |
XAML의 변수 뒤에 있는 액세스 코드 (0) | 2023.05.14 |
Angular 2 비활성화 컨트롤은 form.value에 포함되지 않습니다. (0) | 2023.05.14 |
의 의 의 (0) | 2023.05.14 |