是否LINQ的排序依据不排序原来的集合?(Does Linq OrderBy Not Sort Or

2019-09-22 01:10发布

我使用的LINQ to SQL作为第一次我的数据库层和我所遇到的问题。 基本上,我有一个表单,允许用户创建预定义作业。 预定义的工作可以有许多预定义的工作项目。 例如,一个预定义的工作可能是这样的换油。 预定义的工作项目将是石油,劳动等。在我的数据库PredefinedJobs是一个表,PredefinedJobItems是一个外键回到PredefinedJobs另一个表。 我有用于添加具有LINQ到SQL类备份形式为类变量预定义作业的形式。 有显示所有的工作项目的形式在一个ListView。 一项新功能,要求我跟踪一个项目在ListView的位置。 例如,如果我的项目的ListView看起来像下面,注意顺序:

Qty          Name          Desc          ItemOrder
4            Oil           Penzoil       0
1            Labor                       1

由于该项目是通过一个孩子形式加入我不想提供接入到ListView。 所以,我创建了下面的方法,企图既创造ItemOrder和排序PredefinedJob LINQ到SQL对象的集合。 它不会出现在列表中的排序依据函数实际上排序上PredefinedJob集合。 什么是保持对LINQ到SQL集合(即PredefinedJob.fkJobItems)为了最好的方法是什么? 或者,它会更好,只是传递引用我的ListView成增加的项目,我有机会获得selectedIndex处的工作子窗体?

    private SortAndOrderItems(List<PredefinedJobsItem> items)
    {
        var nextItemOrderNumber = items.Max(max => max.ItemOrder) + 1;
        foreach (var item in items)
        {
            if (item.ItemOrder == null)
            {
                item.ItemOrder = nextItemOrderNumber;
                nextItemOrderNumber++;
            }
        }
        items.OrderBy(i => i.ItemOrder).ToList();
    }

Answer 1:

OrderBy创建一个新的查询,将执行时,不改变原来的列表。

为什么不只是Sort的方法List

items.Sort((a, b) => a.ItemOrder.CompareTo(b.ItemOrder));


Answer 2:

我想你要找的List<>.Sort

class Cmp : IComparer<PredefinedJobsItem>
{
    public int Compare(PredefinedJobsItem x, PredefinedJobsItem y)
    {
        return x.ItemOrder.CompareTo(y.ItemOrder);
    }
}


var comparison = new Cmp();
items.Sort(comparison);


文章来源: Does Linq OrderBy Not Sort Original Collection?