【问题标题】:How can i sort Generic list with Linq?如何使用 Linq 对通用列表进行排序?
【发布时间】:2010-06-17 14:10:51
【问题描述】:

如何在 linq 中对 myScriptCellsCount.MyCellsCharactersCount(list int 类型)进行排序

    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);
        }

【问题讨论】:

    标签: c# linq .net-3.5 sorting generic-list


    【解决方案1】:
    // using Linq
    MyCellsCharactersCount.OrderBy(x => x);            // ascending
    MyCellsCharactersCount.OrderByDescending(x => x);  // descending
    

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

    【讨论】:

    • 应该是 OrderByDescending。
    【解决方案2】:

    您可以使用 OrderBy 或 Sort,但您应该了解两者之间的区别:

    如果您进行排序,它会“就地”对列表进行排序,因此在本例中,变量“list”会被排序:

    // you can manipulate whether you return 1 or -1 to do ascending/descending sorts list.Sort((x, y) => { if (x > y) return 1; else if (x == y) return 0; else return -1; });

    如果您执行 OrderBy,则原始列表不受影响,但会返回一个新的排序枚举:

    var sorted = list.OrderByDescending(x =&gt; x)

    编辑

    这个答案最近被赞成,所以我审查了它。在我最初的回复中,我遗漏了一个非常重要的细节:

    如果您使用上面的 LINQ 代码(第二个示例),则每次迭代变量“sorted”时都会进行排序。因此,如果您在超过 1 个 foreach 中使用它,您将重复排序。为避免这种情况,请将上面的代码更改为:

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

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

    如果你只打算枚举一次,你可以省略 ToList/ToArray 调用。

    【讨论】:

      【解决方案3】:

      您应该能够使用列表中的 OrderBy 方法。

      IEnumerable sortedList = myScriptCellsCount.MyCellsCharactersCount.OrderBy(anInt => anInt);
      

      【讨论】:

        【解决方案4】:
        var sorted = from i in MyCellsCharacterCount orderby i descending select i;
        

        【讨论】:

          【解决方案5】:

          看看this answer。您可以通过获取您的 List 的 typeOf 来将“Process”替换为您的对象。

          干杯

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-29
            • 2010-10-17
            • 2021-11-15
            相关资源
            最近更新 更多