我有两个类
class Variant
{
bool isOrdered;
}
class Item
{
List<Variant> Variants;
}
然后我得到IQueryable<Item>
来 self 的数据源。我想订购变体列表。
例如如果执行查询 IQueryable<Item>
我们得到:
{商品:变体:{true,false,true},商品:变体:{false, false, true},商品:变体:{true,false,true,false}}
以及订购后我需要获取
{Item: Variants:{true,true, false}, Item: Variants:{true,true,false}, Item: Variants:{true,true,false,false} }
我正在尝试类似的事情
var query =
from item in source
from variants in item.Variants
orderby variants.isOrdered
select item;
但此查询不是订购变体而是订购商品,而且我不知道如何订购变体。
最佳答案
如果您感兴趣的只是变体,您可以尝试:
var selections = source.Select(i => i.Variants.OrderByDescending(v => v.isOrdered));
selections
那么将是 IEnumerable<IOrderedEnumerable<Variant>>
具有三个变体枚举(基于您的示例数据),按以下方式排序:
True,True,False
True,False,False
True,True,False,False
更新:
OP 已更新问题以也需要该项目,所以...
有几种方法可以解决这个问题。最不基于 OOP、最少侵入性的方法是将项目以及排序后的变体列表获取到匿名类型中:
var selections = source.Select(i => new
{
Item = i,
SortedVariants = i.Variants.OrderByDescending(v => v.isOrdered)
});
在本例中,selections
将是 IEnumerable<'a>
哪里'a
是匿名类型。该类型将具有两个属性:变体所属的项目以及名为 SortedVariants
的属性。 .
那就有最简单的、不可重用的方法了。每次访问变体时,对它们进行排序:
foreach (var item in source)
{
var variants = item.Variants.OrderByDescending(v => v.isOrdered);
//Do something with the variants
}
更可重用的方法是将另一个属性(或方法)添加到 Variant
以所需顺序返回变体列表的类:
public class Item
{
public List<Variant> Variants;
public IOrderedEnumerable<Variant> OrderedVariants
{
get { return Variants.OrderByDescending(v => v.isOrdered); }
}
//OR
public IOrderedEnumerable<Variant> GetOrderedVariants()
{
return Variants.OrderByDescending(v => v.isOrdered);
}
}
然后您可以使用该属性或方法。
最后,如果您可以灵活地更改当前设计,则始终可以将列表隐藏在界面后面并实现添加方法:
public class Item
{
private List<Variant> _variants = new List<Variant>();
public IEnumerable<Variant> Variants
{
get { return _variants.OrderByDescending(v => v.isOrdered); }
}
public void AddVariant(Variant variant)
{
_variants.Add(variant);
}
}
这将是我个人最喜欢的,因为它提供了变体,满足了要求并隐藏了实现的细节。
关于c# - 如何使用 linq 查询在自定义 Item 类中排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57926228/