1

コードにhttp://www.davekoelle.com/alphanum.htmlを実装して、最初と最後に数字を含む文字列を自然に並べ替えたいと思います。私の問題は、あまりソートを行っていないので、これをオブジェクト構造にどのように実装するかです。

私は

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

そして私はこのタイプの何千もの配列を追加しました:

    "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();

ただし、ご想像のとおり、アルファソートは「1 ...」、「10...」などになります。

私はこのアプローチを試しました:

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

これは機能しますが、3番目の文字列がその特定の形式を満たさない場合は失敗します。これは私を(最終的に)私の質問に導きます-この問題を解決するためにAlphanum.csをどのように実装しますか?

4

2 に答える 2

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();
于 2013-01-13T06:56:59.413 に答える
0

この自然順の実装により、開始する必要があります:http: //www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting

于 2013-01-13T06:24:43.797 に答える