获取自定义顺序列表的最快方法

时间:2014-08-28 10:05:41

标签: c# performance list sorting

我需要找到以自定义顺序获取小字符串或字符列表的最快方法。 我发现了很多关于排序列表的问题,但是在董事会或网上没有关于使用本机类型排序小列表的问题,我发现所有这些都更复杂。

对我来说,输入列表是字符串列表还是字符列表并不重要。我的清单有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毫秒以下进行排序,我不知道是否有可能实现这个目标:)

2 个答案:

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

你说你的输入是字符串/字符,但很少在高性能扑克代码中找到一个位置,其中输入真的是字符串/字符串。

如果你试图解析文本板并弄清楚玩家的表现,通常情况并不那么重要。

如果你正在制作一些详尽的电路板组合,你真的需要坚持使用。