0

可以使用单个 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;
    }
}
4

2 回答 2

2

按优先级顺序为每个枚举值赋予一个数值。按类型对项目列表进行排序并获取第一个。

于 2012-11-27T01:47:09.517 回答
1

您可以构建两棵平衡树。按 CornerTop -> Top -> Side 排序的第一棵树。第二个是 CornerBottom -> 底部 -> 侧面。如果您搜索 CornerTop 或 CornerBottom,您可以获取树中的第一项。如果您搜索其他类型 - 您可以通过 log(N) 直接搜索。在 LINQ 上,您可以对集合进行排序并获取第一个或通过二进制搜索算法进行搜索。

于 2012-11-27T01:59:35.930 回答