0
我有一個自定義的排序例程,但效果很好,但我很好奇如何將其轉換爲使用LINQ或lambda較少的代碼。 SortByGrade排序表示級(K - 12)一個字符串值,以便它返回:K,1,2,3,4等代替1,10,如圖2所示,等轉換自定義數據表排序爲LINQ或lambda表達式
/// <summary>
/// Sorts a grade (K - 12) numerically
/// </summary>
/// <remarks>A sort column is added and then sorted</remarks>
/// <param name="table">table to sort</param>
/// <param name="columnToSort">column to sort</param>
/// <param name="sortDirection">enum of either asc or desc</param>
/// <returns>Sorted data table</returns>
public static DataTable SortByGrade(DataTable table, string columnToSort, SortDirection sortDirection)
{
string tmpSortColumn = "TempSortColumn";
table.Columns.Add(tmpSortColumn, typeof(int));
foreach (DataRow row in table.Rows)
{
row[tmpSortColumn] = ConvertGrade(row[columnToSort].ToString());
}
// sort on our need sort column
table.DefaultView.Sort = String.Format("{0} {1}", tmpSortColumn, sortDirection.ToString());
// return the sorted table
return table.DefaultView.ToTable();
}
和排序助手:
private static int ConvertGrade(string grade)
{
int convertedGrade;
switch(grade.ToUpper().Trim())
{
case "K":
convertedGrade = 0;
break;
case "1":
convertedGrade = 1;
break;
case "2":
convertedGrade = 2;
break;
case "3":
convertedGrade = 3;
break;
case "4":
convertedGrade = 4;
break;
case "5":
convertedGrade = 5;
break;
case "6":
convertedGrade = 6;
break;
case "7":
convertedGrade = 7;
break;
case "8":
convertedGrade = 8;
break;
case "9":
convertedGrade = 9;
break;
case "10":
convertedGrade = 10;
break;
case "11":
convertedGrade = 11;
break;
case "12":
convertedGrade = 12;
break;
// TODO: Remove these cases when the data is cleaned up
case "00":
case "17":
convertedGrade = 100;
break;
default:
convertedGrade = 0;
break;
}
return convertedGrade;
}
非常感謝。
是你仍然希望使用ConvertGrade方法,還是你希望擺脫這種方法的,太? – 2010-08-05 00:54:18
我曾希望用更通用的比較器替換ConvertGrade。我仍然需要檢查具體情況。從IComparer <>繼承的東西。 – 2010-08-05 12:52:11