有趣的问题。我试图按数值对Dictionary<string, string>
进行排序。它适用于List<string>
而不是Dictionary
,我在这里做错了什么?
Dictionary<string, string> s = new Dictionary<string, string>() {
{ "a", "a" },
{ "100", "1" },
{ "2", "2" },
{ "10", "10" },
};
List<string> g = new List<string> {
"1", "10", "a", "1000"
};
var v = 0;
var problem = s.OrderBy(x => int.TryParse(x.Key, out v));
// outputs original order
var works = from c in g
orderby int.TryParse(c,out v)
select c;
// outputs sorted order a, 1, 10, 1000
发布于 2022-06-28 07:10:59
你可以试试这样的东西:
var problem = s
.OrderBy(pair => int.TryParse(pair.Key, out var parsed)
? parsed // Take Key value as it is
: long.MinValue); // Treat pair as the topmost
在这里,我们尝试从键值pair
解析pair
,如果失败,我们将这对放在顶部(为了与可能的int.MinValue
键混合,我使用了long.MinValue
)。您可能需要添加.ThenBy
var problem = s
.OrderBy(pair => int.TryParse(pair.Key, out var parsed)
? parsed // Take Key value as it is
: long.MinValue) // Treat pair as the topmost
.ThenBy(pair => pair.Key);
如果您想对非数字键和数字进行排序,例如:
Dictionary<string, string> demo = new() {
{ "a", "a" },
{ "100", "1" },
{ "2", "2" },
{ "b", "a" },
{ "10", "10" },
{ "c", "a" },
};
var result = demo
.OrderBy(pair => int.TryParse(pair.Key, out var parsed)
? parsed
: long.MinValue)
.ThenBy(pair => pair.Key);
Console.Write($"{string.Join(Environment.NewLine, result)}");
输出:
[a, a]
[b, a]
[c, a]
[2, 2]
[10, 10]
[100, 1]
编辑:如果你想把数字放在第一位,你要做的就是把long.MinValue
改为long.MaxValue
var result = demo
.OrderBy(pair => int.TryParse(pair.Key, out var parsed)
? parsed
: long.MaxValue)
.ThenBy(pair => pair.Key);
https://stackoverflow.com/questions/72781747
复制相似问题