文字列である数値の配列を数値順に並べ替えたいと考えています。
問題は数値をintに変換できません。
コードは次のとおりです:
string[] things= new string[] { "105", "101", "102", "103", "90" };
foreach (var thing in things.OrderBy(x => x))
{
Console.WriteLine(thing);
}
出力:
101, 102, 103, 105, 90
私は…したい:
90, 101, 102, 103, 105
編集:出力は090, 101, 102...
コード サンプルを更新して、「things
」ではなく「sizes
」としました。配列は次のようになります。
string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };
つまり、アルファベット順と番号順に並べ替える必要があります。
007, 90, bob, lauren, paul
ベストアンサー1
カスタム比較子を OrderBy に渡します。列挙可能。順序指定任意の比較演算子を指定できます。
これを実行する方法の 1 つは次のとおりです。
void Main()
{
string[] things = new string[] { "paul", "bob", "lauren", "007", "90", "101"};
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{
Console.WriteLine(thing);
}
}
public class SemiNumericComparer: IComparer<string>
{
/// <summary>
/// Method to determine if a string is a number
/// </summary>
/// <param name="value">String to test</param>
/// <returns>True if numeric</returns>
public static bool IsNumeric(string value)
{
return int.TryParse(value, out _);
}
/// <inheritdoc />
public int Compare(string s1, string s2)
{
const int S1GreaterThanS2 = 1;
const int S2GreaterThanS1 = -1;
var IsNumeric1 = IsNumeric(s1);
var IsNumeric2 = IsNumeric(s2);
if (IsNumeric1 && IsNumeric2)
{
var i1 = Convert.ToInt32(s1);
var i2 = Convert.ToInt32(s2);
if (i1 > i2)
{
return S1GreaterThanS2;
}
if (i1 < i2)
{
return S2GreaterThanS1;
}
return 0;
}
if (IsNumeric1)
{
return S2GreaterThanS1;
}
if (IsNumeric2)
{
return S1GreaterThanS2;
}
return string.Compare(s1, s2, true, CultureInfo.InvariantCulture);
}
}