Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助简化LINQ查询:选择首选类型的项_C#_Linq_Refactoring - Fatal编程技术网

C# 需要帮助简化LINQ查询:选择首选类型的项

C# 需要帮助简化LINQ查询:选择首选类型的项,c#,linq,refactoring,C#,Linq,Refactoring,可以使用单个LINQ表达式执行以下操作吗?我有一个项目清单: public enum ItemType { Top, Bottom, Side, CornerBottom, CornerTop } public class Item { public int ID; public ItemType Type; } 我想根据ItemType选择一个项目-但是,CornerBottom和CornerTop有一个特殊情况。如果我正在搜索一个底

可以使用单个LINQ表达式执行以下操作吗?我有一个项目清单:

public enum ItemType
{
    Top,
    Bottom,
    Side,
    CornerBottom,
    CornerTop
}

public class Item
{
    public int ID;
    public ItemType Type;
}
我想根据ItemType选择一个项目-但是,CornerBottom和CornerTop有一个特殊情况。如果我正在搜索一个底部项目,但没有这样的结果,我会选择底部项目。如果有结果,那么我想要一个附带项目。同样,对于CornerTop,我更喜欢首先是CornerTop项目,然后是Top第二项,然后是Side第三项

这可以用一个表达式来完成吗?现在我有一个switch语句来处理每个ItemType。然而,这很难实现,因为实际上我的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;
    }
}

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

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

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

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

这几乎可以,但如果我搜索类型ItemType.Side,我希望它返回类型Side的内容,或者根本不返回。然后添加Where条件,说明ItemType应该大于Side。我基本上按照您所说的做了,但是将比较检查放在它自己的函数中。这允许更大的灵活性。我在编辑中发布了最终代码。谢谢这几乎是可行的,但如果我正在搜索类型ItemType.Side,我希望它返回类型为Side的内容,或者根本不返回任何内容。然后添加一个Where条件,说明ItemType应该大于Side。我基本上按照您所说的做了,但将比较检查放在了它自己的函数中。这允许更大的灵活性。我在编辑中发布了最终代码。谢谢