0

List以下に示すように、値を保持するa をソートする方法

67.232,S
98.122,F
12.211,H

など ..

今、上記のList値を次のように並べ替える必要があります

12.211,H
67.232,S
98.122,F

最初に、以下のコードを試してみました(これは、文字列のリストを数値的にソートすることから取得しました(1,10,2の代わりに1,2,...,9,10)

 Position.Add(25.251,A);
 Position.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y)));
       static int ExtractNumber(string text)
        {
            Match match = Regex.Match(text, @"^[^,]*");
            if (match == null)
            {
                return 0;
            }

            int value;
            if (!int.TryParse(match.Value, out value))
            {
                return 0;
            }

            return value;
        }

しかし、それは私にとってはうまくいきません

ありがとう

4

3 に答える 3

2

数値の部分を解析して、次を使用できますEnumerable.OrderBy

list = list
    .Select(s => new { NumPart = s.Substring(0, s.LastIndexOf(',')), Item = s })
    .OrderBy(x => double.Parse(x.NumPart, CultureInfo.InvariantCulture))
    .Select(x => x.Item)
    .ToList();

CultureInfo.InvariantCulture多くの文化ではカンマを小数点記号として使用しているため、私が使用したことに注意してください。

デモ

于 2013-06-24T13:51:26.640 に答える
1

LINQ の OrderBy を使用することをお勧めします。これにより、セレクターを指定できます。

var myList = new List<string> { "12.211,H", ... };
var orderedList = myList
    // sort by the number column by splitting each record by comma and parsing the first field as a double
    .OrderBy(s => double.Parse(s.Split(',')[0]))
    .ToList();

既存のコレクションを変更するのではなく、並べ替えられたリストのコピーを作成するため、これは List.Sort() とは少し異なります。

元のアプローチでこれを行うには:

myList.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y)));

// note I've changed the use of int's to doubles since you seem to be working with fractions
static double ExtractNumber(string text)
        {
            var fields = text.Split(',');
            double value;
            if (fields.Length == 0
                || !double.TryParse(fields[0], out value))
            {
                return 0; // as in your original code, missing/unparseable values get treated as 0
            }            

            return value;
        }
于 2013-06-24T13:46:57.663 に答える
1

数値が整数ではないため、アプローチは機能しません! 通貨を扱う場合は を使用しますdecimal。技術的および科学的な計算には を使用しますdouble

static decimal ExtractNumber(string text)
{
    string[] parts = text.Split(',');
    decimal value;
    if (parts.Length > 0 &&
        Decimal.TryParse(parts[0], NumberStyles.Any,
                         CultureInfo.InvariantCulture, out value)) {
        return value;
    }
    return 0;
}

また、数値に小数点として常にポイントがある場合は、インバリアント カルチャを明示的に選択します。たとえば、ドイツの文化ではカンマが使用されます。

于 2013-06-24T14:13:21.673 に答える