2010-06-17 7 views
4

Comment trier myScriptCellsCount.MyCellsCharactersCount (type int list) dans LINQComment puis-je trier la liste générique avec Linq?

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

Répondre

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

ou

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

Il doit être OrderByDescendant. – XIII

1

Vous devriez être en mesure d'utiliser la méthode OrderBy sur votre liste.

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

Vous pouvez utiliser OrderBy ou Trier, mais il y a une différence entre les deux que vous devez comprendre:

Si vous faites de tri, il trie votre liste « en place », donc dans cet exemple, la « liste » variable devient triée:

 

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

Si vous faites un OrderBy, la liste initiale n'est pas affectée, mais un nouveau triée dénombrable est retourné:

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

Modifier

Cette réponse a été récemment upvoted, donc j'examiné. Dans ma réponse originale, j'ai omis un détail vraiment important:

Si vous utilisez le code LINQ ci-dessus (deuxième exemple), le tri se produira chaque fois que vous itérez sur la variable "triée". Donc, si vous l'avez dans plus de 1 foreach, vous répéterez le tri. Pour éviter cela, changer le code ci-dessus:

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

qui forcera le recenseur à courir, et stocke le résultat dans Sorted.

Si vous n'allez énumérer une fois, vous pouvez omettre l'appel ToList/ToArray.

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

Jetez un oeil à this answer. Vous pouvez remplacer "Process" par votre objet en obtenant le type de votre liste.

Cheers