Как правильно реализовать IEnumerable, чтобы возвращать элемент для определения приоритетов по свойству? - PullRequest
0 голосов
/ 16 апреля 2020

Моя цель состоит в том, чтобы вернуть первый элемент Foo из списка foos, который соответствует условию перечисления Boo, и он должен иметь приоритет по значению Boo, как показано в примере, если ни один из элементов соответствует условию, а затем просто вернуть первый элемент.

Модель:

class Foo 
{
    E_Boo Boo { get; set; }
}
enum E_Boo
{
    Undefined = 0,
    Jessie = 1,
    Abby = 2,
    Felix = 3,
    Lacey = 4,
    Lucia = 5,
    Anisa = 6    
}

Это то, что я пытался, это работает:

    public Foo GetFooByBooPriority(IEnumerable<Foo> foos)
    {
        if(foos.Any(x => x.Boo == E_Boo.Abby))
            return foos.First(x => x.Boo == E_Boo.Abby);
        else if (foos.Any(x => x.Boo == E_Boo.Lacey))
            return foos.First(x => x.Boo == E_Boo.Lacey);
        else if (foos.Any(x => x.Boo == E_Boo.Lucia))
            return foos.First(x => x.Boo == E_Boo.Lucia);
        else if (foos.Any(x => x.Boo == E_Boo.Felix))
            return foos.First(x => x.Boo == E_Boo.Felix);
        else if (foos.Any(x => x.Boo == E_Boo.Anisa))
            return foos.First(x => x.Boo == E_Boo.Anisa);
        else if (foos.Any(x => x.Boo == E_Boo.Jessie))
            return foos.First(x => x.Boo == E_Boo.Jessie);
        else
            return foos.First();
    }

Любая идея, как улучшить этот приоритетный ретривер с точки зрения производительности и более чистого кода?

ОБНОВЛЕНИЕ:

В Приоритете logi c необходимо отделить от определения enum E_Boo, другими словами, Если определение перечисления будет изменено, логика приоритетов c должна остаться такой же.

1 Ответ

6 голосов
/ 16 апреля 2020

Я хочу отделить реализацию от значений перечисления и имен

Одним из простых решений было бы добавить List<E_Boo> к вашему коду и заполнить его в порядке E_Boo значений, которые вы хотите:

var booOrder = new List<E_Boo> 
{
    E_Boo.Abby,
    E_Boo.Lacey,
    E_Boo.Lucia,
    E_Boo.Felix,
    // ... And so on
};

И затем сортируйте IEnumerable<Foo> по индексу значения E_Boo в этом списке:

var result = foos.OrderBy(f => booOrder.IndexOf(f.Boo)).First();
...