2010-08-04 36 views
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; 
    } 

非常感謝。

+0

是你仍然希望使用ConvertGrade方法,還是你希望擺脫這種方法的,太? – 2010-08-05 00:54:18

+0

我曾希望用更通用的比較器替換ConvertGrade。我仍然需要檢查具體情況。從IComparer <>繼承的東西。 – 2010-08-05 12:52:11

回答

2

您可以使用DataTableExtensions作爲AsEnumerableCopyToDataTable的方法。

public static DataTable SortByGrade(DataTable table, 
    string columnToSort, SortDirection sortDirection) 
{ 

    IEnumerable<DataRow> query = 
    from row in table.AsEnumerable() 
    orderby ConvertGrade(row[columnToSort].ToString()) 
    select row; 

    if (sortDirection == "DESC") 
    { 
    query = query.Reverse(); 
    } 

    DataTable result = query.CopyToDataTable(); 
    return result; 
} 

和排序幫手:

private static int ConvertGrade(string grade) 
{ 
    string g = grade.ToUpper().Trim(); 
    int convertedGrade = 
    g == "K" ? 0 : 
    g == "1" ? 1 : 
    g == "2" ? 2 : 
    g == "3" ? 3 : 
    g == "4" ? 4 : 
    g == "5" ? 5 : 
    g == "6" ? 6 : 
    g == "7" ? 7 : 
    g == "8" ? 8 : 
    g == "9" ? 9 : 
    g == "10" ? 10 : 
    g == "11" ? 11 : 
    g == "12" ? 12 : 
// TODO: Remove these cases when the data is cleaned up 
    g == "00" ? 100 : 
    g == "17" ? 100 : 
    0; 

    return convertedGrade; 
} 
+0

我不知道CopyToDataTable方法。尼斯。 – 2010-08-05 12:52:39