C# Linq OrderBy是否对原始集合进行排序?

C# Linq OrderBy是否对原始集合进行排序?,c#,winforms,linq,linq-to-sql,C#,Winforms,Linq,Linq To Sql,我第一次使用LINQtoSQL作为我的数据库层,我遇到了一个问题。基本上,我有一个表单,允许用户创建预定义的作业。预定义作业可以有许多预定义作业项。例如,预定义作业可能类似于换油。预定义的作业项将是油、人工等。在我的数据库中,预定义的作业是一个表,预定义的作业项是另一个表,外键返回到预定义的作业。我有一个用于添加预定义作业的表单,其中Linq to Sql类作为类变量支持该表单。表单上有一个列表视图,显示所有作业项。一项新功能要求我跟踪ListView中项目的位置。例如,如果我的项目列表视图如下

我第一次使用LINQtoSQL作为我的数据库层,我遇到了一个问题。基本上,我有一个表单,允许用户创建预定义的作业。预定义作业可以有许多预定义作业项。例如,预定义作业可能类似于换油。预定义的作业项将是油、人工等。在我的数据库中,预定义的作业是一个表,预定义的作业项是另一个表,外键返回到预定义的作业。我有一个用于添加预定义作业的表单,其中Linq to Sql类作为类变量支持该表单。表单上有一个列表视图,显示所有作业项。一项新功能要求我跟踪ListView中项目的位置。例如,如果我的项目列表视图如下所示,请注意顺序:

Qty          Name          Desc          ItemOrder
4            Oil           Penzoil       0
1            Labor                       1
因为项目是通过子表单添加的,所以我不想提供对ListView的访问。因此,我创建了下面的方法,试图在预定义的Job Linq to Sql对象上创建ItemOrder并对集合进行排序。列表上的OrderBy函数似乎并没有对预定义作业上的集合进行实际排序。在Linq to Sql集合(即预定义的job.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();
    }
私有排序和排序项目(列表项目)
{
var nextItemOrderNumber=items.Max(Max=>Max.ItemOrder)+1;
foreach(项目中的var项目)
{
if(item.ItemOrder==null)
{
item.ItemOrder=nextItemOrderNumber;
nextItemOrderNumber++;
}
}
items.OrderBy(i=>i.ItemOrder.ToList();
}

我想你在找

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


var comparison = new Cmp();
items.Sort(comparison);
Cmp类:IComparer
{
公共整数比较(预定义的jobsitem x,预定义的jobsitem y)
{
返回x.ItemOrder.CompareTo(y.ItemOrder);
}
}
var比较=新的Cmp();
项目。排序(比较);

OrderBy
创建一个新查询,该查询在执行时不会更改原始列表

为什么不仅仅是
列表的方法

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

谢谢你的回复。列表的排序方法是否会对内存中的实际集合(即Linq对象上的项目集合)进行排序?是的,该方法将对列表进行就地排序。非常好,我感谢您的帮助。我慢慢地开始掌握这个窍门了。有时候,花费时间最多的是简单的事情。顺便说一句,你知道有什么适合Lambda表达式初学者的网络资源吗?我试着阅读MSDN上的文档,对于初学者来说很难理解。@Grasshopper是的,没错!:-)我真的很推荐你。这是一本书,不是一个网站,但它是完全值得的。好吧,我遗漏的是,上面的方法是通过将EntitySet转换为List来调用的。这将适用于列表,但不适用于EntitySet:job.fkItems(其中job是预定义的job Linq实体,fkItems是预定义的JobItems的集合)。关于如何对EntitySet进行排序,有什么建议吗?