c# - 如何使用 linq 查询在自定义 Item 类中排序列表

标签 c# linq

我有两个类

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/

相关文章:

c# - 方法必须在非泛型静态类中定义

c# - WPF如何获取当前屏幕的大小?

c# - WebBroser1.Navigate 只工作一次 (C#)(重新加载网络浏览器)

.net - 我在哪里可以获得有关 ! VB.Net 在 Linq to DataSet 中使用的运算符?

c# - 用于查找包含整数数组中所有元素的所有对象的表达式

c# - 将 IEnumerable<T> 转换为字符串 []

c# - 如何使我的代码诊断语法节点操作对已关闭的文件起作用?

c# - mysql +c# 如何将 mysqldataReader 转换为正确的日期时间

c# - 比较两个通用列表

c# - Sqlite PCL 和 Linq - SQLite.Net Table 方法是否将整个表加载到一个集合中?