私はこれに関する多くの投稿を見つけましたが、それらを私の場合と一致させることができませんでした。
リストにいくつかの文字列があります
List<string> list = new List<string>{ "100-1", "100-11", "100-3", "100-20" }
次のコードを使用して、この場所から選択されたものを並べ替えました
void Main()
{
string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{
Console.WriteLine(thing);
}
}
public class SemiNumericComparer: IComparer<string>
{
public int Compare(string s1, string s2)
{
if (IsNumeric(s1) && IsNumeric(s2))
{
if (Convert.ToInt32(s1) > Convert.ToInt32(s2)) return 1;
if (Convert.ToInt32(s1) < Convert.ToInt32(s2)) return -1;
if (Convert.ToInt32(s1) == Convert.ToInt32(s2)) return 0;
}
if (IsNumeric(s1) && !IsNumeric(s2))
return -1;
if (!IsNumeric(s1) && IsNumeric(s2))
return 1;
return string.Compare(s1, s2, true);
}
public static bool IsNumeric(object value)
{
try {
int i = Convert.ToInt32(value.ToString());
return true;
}
catch (FormatException) {
return false;
}
}
}
私の出力は100-1, 100-11, 100-20, 100-3
値をとっ-
てdecimal
比較していると思います。実際、私は結果がになることを期待していました
100-1, 100-3, 100-11, 100-20
。実際にソートを実行している基準を知りたかっただけです。どんな助けでも大歓迎です。100-2
私でさえ、それが異なって扱われることを期待してい100-20
ます。
その場で、Infragisticコントロールグリッドで、ソートすると、ここで期待していたのと同じ結果が得られることを確認しました。
編集
リストには他にも多くの文字列値があり、整数や倍精度浮動小数点数などもあります。ハイフンはここで言及されている単なる事例です。