如何使用Linq对泛型列表进行排序?

4
如何在LINQ中对list int类型的myScriptCellsCount.MyCellsCharactersCount进行排序?
    public class MyExcelSheetsCells
    {
        public List<int> MyCellsCharactersCount { get; set; }

        public MyExcelSheetsCells()
        {
            MyCellsCharactersCount = new List<int>();
        }

    }

   void ArrangedDataList(DataTable dTable)
        {
            DAL.MyExcelSheets myexcelSheet = new DAL.MyExcelSheets();
            myScriptCellsCount = new TestExceltoSql.DAL.MyExcelSheetsCells();

            foreach (DataColumn col in dTable.Columns)
                myexcelSheet.MyColumnNames.Add(col.ColumnName.ToString());
            foreach(DataColumn dc in dTable.Columns)
            foreach (DataRow  dr in dTable.Rows)
                myScriptCellsCount.MyCellsCharactersCount.Add(dr[dc].ToString().Length);
          //How can i sort desc
            //myScriptCellsCount.MyCellsCharactersCount = from list in myScriptCellsCount.MyCellsCharactersCount
            //                                            orderby list.CompareTo( descending
            //                                            select list;
            CreatSqlTable(myexcelSheet.MyColumnNames, dTable.TableName, myScriptCellsCount.MyCellsCharactersCount[0].ToString());
            myscript.WriteScript(myscript.SqlScripts);
        }
5个回答

9
// using Linq
MyCellsCharactersCount.OrderBy(x => x);            // ascending
MyCellsCharactersCount.OrderByDescending(x => x);  // descending

或者
// not using Linq
MyCellsCharactersCount.Sort();                     // ascending
MyCellsCharactersCount.Sort().Reverse();           // descending

应该使用OrderByDescending。 - Kris van der Mast

9
您可以使用OrderBy或Sort,但这两者之间存在差异,您应该了解:

如果您使用Sort,它会“原地”对列表进行排序,因此在此示例中,变量“list”被排序:


// 您可以操纵返回1或-1来进行升序/降序排序
list.Sort((x, y) =>
{
   if (x > y) return 1;
   else if (x == y) return 0;
   else return -1;
});

如果您使用OrderBy,则不会影响原始列表,但会返回一个新的已排序可枚举对象:

var sorted = list.OrderByDescending(x => x)

编辑

最近这个回答得到了点赞,所以我对它进行了审查。在我的原始回复中,我遗漏了一个非常重要的细节:

如果你使用上面的LINQ代码(第二个例子),排序将会在每次迭代变量“sorted”时发生。因此,如果你有多个foreach循环,你将重复排序。为了避免这种情况,请将上面的代码更改为:

var sorted = list.OrderByDescending(x => x).ToList(); // or .ToArray()

这将强制枚举运行,并将结果存储在sorted中。

如果您只需要枚举一次,可以省略ToList/ToArray调用。


1
你应该能够在列表上使用 OrderBy 方法。
IEnumerable sortedList = myScriptCellsCount.MyCellsCharactersCount.OrderBy(anInt => anInt);

0
var sorted = from i in MyCellsCharacterCount orderby i descending select i;

0

看一下这个答案。你可以通过获取List的typeOf来将“Process”替换为你的对象。

祝好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接