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

Sha*_*ani 0 c# ienumerable .net-core

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

这是我尝试过的,它有效:

    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();
    }
Run Code Online (Sandbox Code Playgroud)

任何想法如何在性能和更清晰的代码方面改进这个优先检索器?

更新:

在优先级逻辑需要与枚举E_Boo定义解耦,换句话说,如果枚举定义发生变化,优先级逻辑应该保持smae。

Zoh*_*led 6

我想将实现与枚举值和名称分离

一种简单的解决方案是将 a 添加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
};
Run Code Online (Sandbox Code Playgroud)

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

var result = foos.OrderBy(f => booOrder.IndexOf(f.Boo)).First();
Run Code Online (Sandbox Code Playgroud)

  • @AlexeiLevenkov,如果它的值足够小以适合枚举,我不认为所使用的搜索算法会导致任何性能问题。在性能方面,我可能想尝试使用数组而不是列表,但我真的认为在这种情况下这并不重要。不过还是谢谢你的反馈:-) (2认同)