2011-02-25 30 views
8

我有一個字符串的列表,這些字符串包含數字和單詞。Linq - 按號碼然後字母

我想要做的是數字順序它(數字順序),其次是字(排名不分先後)

我的列表中不包含這兩者的搭配......這裏有一個例子

1,5,500,LT,RT,400 - > LINQ - > 1, 5,400,500,LT,RT

這裏是什麼,我有一個例子,它的工作原理,但我想知道是否有更好的寫作方式?

  int results = 0; 
      // Grabs all voltages 
      var voltage = ActiveRecordLinq.AsQueryable<Equipment>() 
       .OrderBy(x => x.Voltage) 
       .Select(x => x.Voltage) 
       .Distinct() 
       .ToList(); 
      // Order by numeric 
      var numberVoltage = voltage 
       .Where(x => int.TryParse(x, out results)) 
       .OrderBy(x => Convert.ToInt32(x)); 
      // Then by alpha 
      var letterVoltage = voltage 
       .Where(x=> !String.IsNullOrEmpty(x)) 
       .Where(x => !int.TryParse(x, out results)) 
       .OrderBy(x => x); 

      return numberVoltage.Union(letterVoltage) 

感謝您的幫助!

+0

爲什麼你保持int解析,電壓沒有定義爲int? – Jimmy 2011-02-25 18:15:12

+0

@Jimmy - Nope,電壓不是定義爲int,因爲它包含一些字,在這種情況下是「LT」。它也被定義爲數據庫中的字符串 – ChickSentMeHighE 2011-02-25 18:17:58

回答

17

假設你正在做這一切的過程(因爲你已經有了一個ToList電話)我覺得我只是用一個自定義比較:

return ActiveRecordLinq.AsQueryable<Equipment>() 
         .Select(x => x.Voltage) 
         .Distinct() 
         .AsEnumerable() // Do the rest in-process 
         .Where(x => !string.IsNullOrEmpty(x)) 
         .OrderBy(x => x, new AlphaNumericComparer()) 
         .ToList(); 

AlphaNumericComparer實現IComparer<string>,像這樣的:

public int Compare(string first, string second) 
{ 
    // For simplicity, let's assume neither is null :) 

    int firstNumber, secondNumber; 
    bool firstIsNumber = int.TryParse(first, out firstNumber); 
    bool secondIsNumber = int.TryParse(second, out secondNumber); 

    if (firstIsNumber) 
    { 
     // If they're both numbers, compare them; otherwise first comes first 
     return secondIsNumber ? firstNumber.CompareTo(secondNumber) : -1; 
    } 
    // If second is a number, that should come first; otherwise compare 
    // as strings 
    return secondIsNumber ? 1 : first.CompareTo(second); 
} 

可以使用巨型條件的後半部分:

public int Compare(string first, string second) 
{ 
    // For simplicity, let's assume neither is null :) 

    int firstNumber, secondNumber; 
    bool firstIsNumber = int.TryParse(first, out firstNumber); 
    bool secondIsNumber = int.TryParse(second, out secondNumber); 

    return firstIsNumber 
     ? secondIsNumber ? firstNumber.CompareTo(secondNumber) : -1; 
     : secondIsNumber ? 1 : first.CompareTo(second); 
} 

...但在這種情況下,我不認爲我會:)

+0

工程很棒!謝謝! – ChickSentMeHighE 2011-02-25 19:51:06

6

此解決方案嘗試解析每個值一次。

List<string> voltage = new List<string>() { "1", "5", "500" , "LT", "RT", "400" }; 

List<string> result = voltage 
    .OrderBy(s => 
    { 
    int i = 0; 
    return int.TryParse(s, out i) ? i : int.MaxValue; 
    }) 
    .ThenBy(s => s) 
    .ToList(); 
相關問題