Фильтрация Linq на основе Enum, с определенным исключением уникального значения - PullRequest
0 голосов
/ 15 мая 2019

Чтобы упростить, допустим, у меня есть MyEnum и MyClass:

enum MyEnum
{
    Undefined = 0,
    A = 1,
    B = 2,
    C = 3,
    D = 4
}

class MyClass { MyEnum MyEnumValue { get; set; } }

Чтобы отфильтровать список MyClass по значению MyEnum, которое я использую:

list.Where(r => r.MyEnumValue == myEnum);

Но если MyEnum равно конкретному значению (скажем, MyEnum.B), мне потребуется список, чтобы вернуть также любые значения, которые равны MyEnum.B или MyEnum.A.

Вот что я придумал:

public static MyClass MyClass_By_MyEnum(IEnumarable<MyClass> list, MyEnum myEnum)
{
    if (myEnum == MyEnum.B)
    {
        return list.Where(r =>
                        r.MyEnumValue == MyEnum.A || 
                        r.MyEnumValue == MyEnum.B ||
                        r.MyEnumValue == MyEnum.C
                    ).FirstOrDefault();
    }
    else
    {
        return list.Where(r => r.MyEnumValue == myEnum).FirstOrDefault();
    }
}

Есть ли способ достичь этого, используя только одну строку? без оператора if else?

РЕДАКТИРОВАТЬ 1: Я ищу лучшее решение на основе дизайна, любое предложение?

Ответы [ 4 ]

4 голосов
/ 15 мая 2019

Использовать массив. Кроме того, вам не нужно использовать Where, поскольку вы можете передать делегата FirstOrDefault.

var lookFor = new [] { MyEnum.A, MyEnum.B, MyEnum.C };
return list.FirstOrDefault(r => lookFor.Contains(r.MyEnumValue));
2 голосов
/ 15 мая 2019

Это самое короткое, что я могу придумать.Не уверен, если это делает намерение намного яснее, однако.

list.Where(r => r.MyEnumValue == myEnum || (myEnum == MyEnum.B && r.MyEnumValue == MyEnum.A)).FirstOrDefault();
1 голос
/ 15 мая 2019

как насчет !=

 return list.Where(r =>
                        r.MyEnumValue != MyEnum.Undefined  || 
                        r.MyEnumValue != MyEnum.D
                    ).FirstOrDefault();

В реальном случае мы можем взять меньше элементов в массиве lookFor и использовать отрицание, что-то вроде

var lookFor = new [] { MyEnum.Undefined, MyEnum.D};
return list.FirstOrDefault(r => !lookFor.Contains(r.MyEnumValue));

Пожалуйста, проверьте отрицание в FirstOrDefaultзапрос, это поможет нам сократить элементы в loofFor массив

0 голосов
/ 15 мая 2019

Закончилось смешение @ john-wu и @ botz3000 ответов:

var lookFor = new [] { MyEnum.A, MyEnum.B, MyEnum.C };

list.FirstOrDefault(r => r.MyEnumValue == myEnum || (
                             myEnum == MyEnum.B && lookFor.Contains(r.MyEnumValue)
                         )
                    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...