をソートしようとしていArrayList
ますString
。
与えられた:
{A,C,AA,B,CC,BB}
Arraylist.Sort
与えます:
{A,AA,B,BB,C,CC}
私が必要とするのは:
{A,B,C,AA,BB,CC}
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
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();
これは一種の古い学校ですが、私は IComparer Interface に行きました。. .
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
関数と関数を利用するには、ToArray()
メソッドを使用する (または単にList<string>
ArrayList の instad を使用する)ことをお勧めします。次のようになります。OrderBy
ThenBy
list = list.OrderBy(/*Order it by length*/).ThenBy(/*Order alphabetically*/);
IComparable
2 つの文字列を受け取るクラスを作成し、次のように並べ替えることができます。
if (a.Length == b.Length)
return String.Compare(a, b);
return a.Length.CompareTo(b.Length);
ケースを処理することもできnull
ます。