我需要找到以自定义顺序获取小字符串或字符列表的最快方法。 我发现了很多关于排序列表的问题,但是在董事会或网上没有关于使用本机类型排序小列表的问题,我发现所有这些都更复杂。
对我来说,输入列表是字符串列表还是字符列表并不重要。我的清单有5到7个项目,它们看起来像这样:“1”,“Q”,“A”,“8”,“9”。我希望我的输入顺序如下:“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“1”,“J”, “Q”,“K”,“A”。
我尝试了以下代码:
1 = 3.1-3.5毫秒:
static readonly List<String> codeValueSortOrder = new List<String>
{
"2", "3", "4", "5", "6", "7", "8", "9", "1", "J", "Q", "K", "A"
};
input.OrderBy(i => codeValueSortOrder.IndexOf(i.ToString())).ToList();
2 = 5.0-6.0毫秒:
input.OrderBy(i => i[1] == 'A')
.ThenBy(i => i[1] == 'K')
.ThenBy(i => i[1] == 'Q')
.ThenBy(i => i[1] == 'J')
.ThenBy(i => i.Substring(1, i.Length - 1) == "10")
.ThenBy(i => i[1] == '9')
.ThenBy(i => i[1] == '8')
.ThenBy(i => i[1] == '7')
.ThenBy(i => i[1] == '6')
.ThenBy(i => i[1] == '5')
.ThenBy(i => i[1] == '4')
.ThenBy(i => i[1] == '3')
.ThenBy(i => i[1] == '2')
.ToList();
我还查看了codeproject上的一些项目,但这些代码是针对数百万项目的,如果我们只想在5到7项之间进行排序,我无法想象它们是最有效的方式。我的目标是在0.1毫秒以下进行排序,我不知道是否有可能实现这个目标:)
答案 0 :(得分:2)
您可以使用Dictionary<string, int>
,其中键是字符串,值是索引。
您甚至可以使用List<string>
为基础:
private static readonly List<string> _List = new List<string> { "2", "3", "4", "5", "6", "7", "8", "9", "1", "J", "Q", "K", "A" };
static readonly Dictionary<string, int> Order = _List
.ToDictionary(str => str, str => _List.IndexOf(str) + 1);
现在您可以使用List.Sort
,而不需要像LINQ方法那样创建新列表:
var input = new List<string> { "1", "Q", "A", "8", "9" };
int i1, i2;
input.Sort((s1, s2) =>
{
Order.TryGetValue(s1, out i1);
Order.TryGetValue(s2, out i2);
return i1.CompareTo(i2);
});
结果顺序:8,9,1,Q,A
快速测试显示:StopWatch.Elapsed.TotalMilliseconds
0.0045
Dictionary.TryGetValue
将返回索引,否则返回0。这就是为什么我使用上面的_List.IndexOf(str) + 1
来强制查找找到的项目的最后一次。
如果你想降序,你只需要逆转它:
return i2.CompareTo(i1);
答案 1 :(得分:1)
如果你正在尝试编写高性能的扑克代码,你真的需要摆脱字符串/字符表示并坚持使用int 0-12值来获得deces-aces
你说你的输入是字符串/字符,但很少在高性能扑克代码中找到一个位置,其中输入真的是字符串/字符串。
如果你试图解析文本板并弄清楚玩家的表现,通常情况并不那么重要。
如果你正在制作一些详尽的电路板组合,你真的需要坚持使用。