bestsource

LINQ: "포함" 및 람다 쿼리

bestsource 2023. 5. 14. 10:48
반응형

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

반응형