如何对C#中包含(67.232,S)等值的列表进行排序

本文关键字:列表 排序 包含 | 更新日期: 2023-09-27 18:19:37

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

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;
        }

但对我来说没用有人能帮我吗?

感谢

如何对C#中包含(67.232,S)等值的列表进行排序

您可以解析数字部分并使用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,因为许多区域性使用逗号作为小数分隔符。

DEMO

我建议使用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;
        }

您的方法不起作用,因为您的数字不是int!如果您使用的是货币,请使用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;
}

如果数字总是有一个点作为小数分隔符,也要显式选择不变区域性。例如,德国文化使用逗号。