如何正确实施 IEnumerable 到 return 项以按 属性 优先级排序?
How to properly implement IEnumerable to return item to be prioritize by a property?
我的目标是 return foo 列表中第一个 Foo
项与 Boo
枚举条件相匹配,它应该由 Boo
优先值如示例中所示,如果 none 个项目符合条件,则只有 return 第一个项目。
型号:
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。
I want to decouple the implementation from the enum values, and names
一个简单的解决方案是在您的代码中添加一个 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();
我的目标是 return foo 列表中第一个 Foo
项与 Boo
枚举条件相匹配,它应该由 Boo
优先值如示例中所示,如果 none 个项目符合条件,则只有 return 第一个项目。
型号:
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。
I want to decouple the implementation from the enum values, and names
一个简单的解决方案是在您的代码中添加一个 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();