如何对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;
}
但对我来说没用有人能帮我吗?
感谢
您可以解析数字部分并使用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;
}
如果数字总是有一个点作为小数分隔符,也要显式选择不变区域性。例如,德国文化使用逗号。