【发布时间】:2014-11-21 23:24:20
【问题描述】:
我有一组静态类别,以及一个传入的不同类别的项目列表。我想获取与最佳类别匹配的第一个项目,如果没有找到,则获取与次佳类别匹配的第一个项目,等等,直到我到达默认类别。
我尝试将我的类别放入一个 IEnumerable 并对其执行Contains() 以查看我传入的项目是否与某个类别匹配,并在第一个匹配项时停止。但我无法控制匹配顺序:如果类别列表按优先级排序[best, OK, default],则类别列表中与 anything 匹配的第一个输入项获胜。因此,如果我的第一个输入项匹配OK,而第二个输入项匹配Best,那么我将在获得Best 匹配之前停止。
现在我在项目列表上运行Where(),如果结果为空,我运行第二个Where(),等等。我想知道是否有更简洁(或更多 LINQ 惯用)的方式写这个:
public MyVM getVM( IEnumerable<Entities.Foo> foos )
{
Entities.Foo foo = null;
MyVM myVM = null;
if ( entity.IsBar )
{
foo = foos.Where( f => f.FooCatId == FooCategories.BestCat ).FirstOrDefault();
}
// no foos are BestCat, look for OkCat
if ( foo == null )
{
foo = foos.Where( f => f.FooCatId == FooCategories.OkCat ).FirstOrDefault();
}
// no foos are OkCat, look for DefaultCat
if ( foo == null )
{
foo = foos.Where( f => f.FooCatId == FooCategories.DefaultCat ).FirstOrDefault();
}
if ( foo != null )
{
myVM = new MyVM() { Name = foo.Name };
}
return myVM;
}
public enum FooCategories
{
DefaultCat,
SomeCat,
AnotherCat,
OkCat,
BestCat,
BadCat
}
【问题讨论】:
标签: c# linq linq-to-objects