0

如何对List包含值的 a 进行排序,如下所述

67.232,S
98.122,F
12.211,H

所以 ..

现在我需要对上面的List值进行排序

12.211,H
67.232,S
98.122,F

最初我尝试使用下面的代码(我从对字符串列表进行数字排序 (1,2,...,9,10 而不是 1,10,2) 得到

 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 回答