2013-01-13 58 views
1

我想實現http://www.davekoelle.com/alphanum.html在我的代碼做在開頭和結尾數字的字符串的一些自然排序。我的問題,沒有做過多的排序是我如何實現這個到我的對象結構。排序列表 - 找到解決方案,但不知道如何實現

我有一個

List<string[]> myStringArrays = new List<string[]>(); 

,我已經添加了此類型的數組的1000年:

"text", "text", "1, label:3", "","","", etc ... 
    "text", "text", "2, label:2", "","","", etc ... 
    "text", "text", "2, label:1", "","","", etc ... 
    "text", "text", "10, label:3", "","","", etc ... 

編輯:(標籤總是在這個例子中 「標籤」)

並且我一直在用LINQ進行分類

 myStringArrays = myStringArrays.OrderBy(m => m[2]).ToList(); 

,但正如你猜測的那樣,它排序爲alpha排序「1 ...」,「10 ...」等等。

我嘗試這樣的做法:

 myStringArrays = myStringArrays.OrderBy(m => (m[2].Split(',')[0])).ThenBy(m => m[2].Split(':')[2]).ToList(); 

其作品,但如果我的第三根弦不符合特定格式失敗。這導致我(最終)我的問題 - 我將如何實現Alphanum.cs來解決這個問題?

+0

不應該認爲是'.ThenBy(M => M [2] .Split( ':')[1] )'而不是'。ThenBy(m => m [2] .Split(':')[2])'? –

+0

哦,對不起,忘了提「標籤」似乎總是一樣的。這是一個像「實驗」的標識符...所以我只需要在最後對數字進行排序。 – Sisyphus

回答

1

這並不難實現,但它只是一個解析字符串他們在數字和非數字字符分割,並對它們進行比較的問題。下面是我扔在一起的實現:

public class AlphaNum : IComparable<AlphaNum> { 

    private List<string> _alphas; 
    private List<int> _nums; 

    public AlphaNum(string value) { 
    _alphas = new List<string>(); 
    _nums = new List<int>(); 
    bool alpha = true; 
    int ofs = 0; 
    for (int i = 0; i <= value.Length; i++) { 
     if (i == value.Length || Char.IsDigit(value[i]) == alpha) { 
     string s = value.Substring(ofs, i - ofs); 
     if (alpha) { 
      _alphas.Add(s); 
     } else { 
      _nums.Add(Int32.Parse(s)); 
     } 
     ofs = i; 
     alpha = !alpha; 
     } 
    } 
    } 

    public int CompareTo(AlphaNum other) { 
    for (int i = 0;; i++) { 
     bool e = i >= _alphas.Count; 
     bool oe = i >= other._alphas.Count; 
     if (e || oe) return e && oe ? 0 : e ? -1 : 1; 
     int c = _alphas[i].CompareTo(other._alphas[i]); 
     if (c != 0) return c; 
     e = i >= _nums.Count; 
     oe = i >= other._nums.Count; 
     if (e || oe) return e && oe ? 0 : e ? -1 : 1; 
     c = _nums[i].CompareTo(other._nums[i]); 
     if (c != 0) return c; 
    } 
    } 

} 

用法:

myStringArrays = myStringArrays.OrderBy(x => new AlphaNum(x[2])).ToList(); 
+0

謝謝 - 我想我需要回到我的「HeadFirst C#」並查看執行排序方法。測試你的代碼,它的工作原理。 – Sisyphus

相關問題