可以使用单个 LINQ 表达式完成以下操作吗?我有一个项目清单:
public enum ItemType
{
Top,
Bottom,
Side,
CornerBottom,
CornerTop
}
public class Item
{
public int ID;
public ItemType Type;
}
我想根据 ItemType 选择一个项目 - 但是,CornerBottom 和 CornerTop 有一个特殊情况。如果我正在搜索 CornerBottom 项目,但没有这样的结果,我想要一个底部项目。如果有结果,那么我想要一个辅助项目。与 CornerTop 类似,我更喜欢 CornerTop 项目,然后是 Top,然后是 Side 第三。
这可以用一个表达式来完成吗?现在我有一个处理每个 ItemType 的 switch 语句。但是,这很笨拙,因为实际上我的 Item 类更复杂(并且我有更多 ItemTypes),而且我有很多不同的查询需要这个核心功能。
编辑:好的,我的最终解决方案是这样的。根据 Spencer 的建议,我使用我喜欢的搜索顺序对 ItemType 枚举进行了重新排序。然后我只是将自定义比较代码放在另一个函数中(这将易于重用),并且只需 orderby 并返回第一个值。
ItemType searchType = ItemType.CornerTop;
var i = (from item in Items
where typeCheck(item, searchType)
orderby item.Type descending).FirstOrDefault();
bool typeCheck(Item item, ItemType type)
{
switch (type)
{
case ItemType.CornerTop:
return (item.Type == ItemType.CornerTop)
|| (item.Type == ItemType.Top)
|| (item.Type == ItemType.Side);
case ItemType.CornerBottom:
return (item.Type == ItemType.CornerBottom)
|| (item.Type == ItemType.Bottom)
|| (item.Type == ItemType.Side);
default:
return item.Type == type;
}
}