如何正确实现IEnumerable以返回由属性排定优先级的项目



我的目标是返回与Boo枚举条件匹配的foo列表中的第一个Foo项,并且应该按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();
}

你知道如何在性能和更干净的代码方面改进这个优先级检索器吗?

更新:

在中,优先级逻辑需要与枚举E_Boo定义解耦,换句话说,如果枚举定义将被更改,则优先级逻辑应保持smae。

我想将实现与枚举值解耦,并将其命名为

一个简单的解决方案是将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
};

然后根据该列表中E_Boo值的索引对IEnumerable<Foo>进行排序:

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

相关内容

最新更新