簡體   English   中英

需要幫助來簡化LINQ查詢:選擇首選類型的項目

[英]Need help simplifying a LINQ query: choosing an item of a preferred type

可以使用單個LINQ表達式完成以下操作嗎? 我有一個物品清單:

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

public class Item
{
    public int ID;
    public ItemType Type;
}

我想根據ItemType選擇一個Item-但是,CornerBottom和CornerTop有一個特殊情況。 如果我正在搜索CornerBottom Item,但沒有此類結果,我會希望使用Bottom Item。 如果有結果,那么我想要配飾。 同樣,對於CornerTop,我希望先選擇CornerTop項目,然后再選擇Top,然后再選擇Side。

可以用一個表達式完成嗎? 現在,我有一個switch語句處理每個ItemType。 但是,這很麻煩,因為實際上我的Item類更復雜(並且我有更多的ItemTypes),而且我有很多需要此核心功能的不同查詢。

編輯:好的,我的最終解決方案是這個。 根據Spencer的建議,我按照偏好的搜索順序對ItemType枚舉進行了重新排序。 然后,我只是將自定義比較代碼放在另一個函數中(該代碼將易於重用),然后僅排序並返回第一個值。

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排序的第一棵樹。 第二個由CornerBottom-> Bottom-> Side組成。 如果搜索CornerTop或CornerBottom,則可以獲取樹中的第一個項目。 如果您搜索其他類型-您可以直接通過log(N)搜索。 在LINQ上,您可以對集合進行排序,並搶先收集或按二進制搜索算法進行搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM