IT박스

LINQ : "포함"및 Lambda 쿼리

itboxs 2020. 6. 7. 10:49
반응형

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

반응형