[英]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.