2013-01-10 279 views
4

我正在嘗試排序StringArrayListC#排序Arraylist字符串按字母順序排列

考慮:

{A,C,AA,B,CC,BB} 

Arraylist.Sort給出:

{A,AA,B,BB,C,CC} 

我需要的是:

{A,B,C,AA,BB,CC} 
+1

首先劈seperat清單列表,然後逐一對它們進行排序。 – Moriya

+1

是否有沒有使用強類型'List '的原因? –

+0

在LinkedList上使用ArrayList有很多優點。 – rbtLong

回答

0

這是一所古老的學校,但我去了IComparer界面。 。 。

public class SortAlphabetLength : System.Collections.IComparer 
{ 
    public int Compare(Object x, Object y) 
    { 
     if (x.ToString().Length == y.ToString().Length) 
      return string.Compare(x.ToString(), y.ToString()); 
     else if (x.ToString().Length > y.ToString().Length) 
      return 1; 
     else 
      return -1; 
    } 
} 

然後測試它。 。 。

class Program 
{ 
    static void Main(string[] args) 
    { 
     ArrayList values = new ArrayList() 
     { 
      "A","AA","B","BB","C","CC" 
     }; 

     SortAlphabetLength alphaLen = new SortAlphabetLength(); 
     values.Sort(alphaLen); 

     foreach (string itm in values) 
      Console.WriteLine(itm); 
    } 
} 

輸出:根據長度

A 
B 
C 
AA 
BB 
CC 
+1

現在在該集合中放置一個「null」值,看看會發生什麼。 – Servy

+0

對不起,我沒有看到這個問題。我只是想回答這個問題。謝謝你指出,雖然。 – rbtLong

+0

如果您編寫的代碼只顯示該示例的排序值,那麼您只需打印出A,BC,...這是* example *輸入,而不是他必須輸入的唯一輸入它。 – Servy

12
ArrayList list = new ArrayList {"A","C","AA","B","CC","BB"}; 

var sorted = list.Cast<string>() 
       .OrderBy(str => str.Length) 
       .ThenBy(str => str); 

//LinqPad specific print call 
sorted.Dump(); 

打印:

A 
B 
C 
AA 
BB 
CC 
+0

請注意,這不會修改ArrayList,它將創建該集合中值的新序列。 (這可能是可以接受的,重要的是要意識到這一點。) – Servy

+0

是的,當然,好的音符。另一個需要注意的是,即使你在'sorted'變量被聲明之後,但實際調用之前修改了'list',它也會包含新元素。 「排序」查詢正在以延遲方式執行 –

4

它更容易使用LINQ這樣做,因爲這樣:

string [] list = { "A","C","AA","B","CC","BB"}; 

var sorted = list.OrderBy(x=>x.Length).ThenBy(x=>x); 

注意,OrderBy方法返回一個新的列表。如果要修改原來的,那麼你需要重新指定爲這樣:

list = list.OrderBy(x=>x.Length).ThenBy(x=>x).ToArray(); 
0

我會建議使用ToArray()方法(或只使用一個List<string> instad一個ArrayList的),以充分利用OrderBy的和ThenBy函數。這將是這個樣子:

list = list.OrderBy(/*Order it by length*/).ThenBy(/*Order alphabetically*/); 
0

您可以創建一個IComparable類回吐兩個字符串,並如下對它們進行排序:

if (a.Length == b.Length) 
    return String.Compare(a, b); 
return a.Length.CompareTo(b.Length); 

您可能還需要處理null案件。