.NET是否有通用收集算法库?我希望能够写出这样的东西:
IList<T> items = GetItemsFromSomeWhere();
Algorithms<T>.Sort(items);
//
// ....
//
T item = GetItemSomwHow();
int i = Algorithms<T>.IndexOf(items, item);
请注意,items
不是List<T>
,否则我只能使用List<T>.Sort
和List<T>.BinarySearch
方法。
当然,我可以自己实施,我只是不想重新发明轮子。
我也希望实施效率很高。
P.S。
请不要建议使用哪些收藏品。我完全了解Array
或List<T>
能力。我需要的是一个算法库,可用于任何基于IList<T>
的集合。
修改 找到我需要的东西 - 看看我自己的答案。
答案 0 :(得分:2)
System.Linq.Enumerable
class做了很多好事。不可否认,它确实错过了一些东西,但它仍适用。
答案 1 :(得分:2)
不幸的是,.NET没有提供与IList<T>
接口一起使用的内置BinarySearch实现。
您可以使用Linq对通用列表进行排序,正如其他海报所提到的那样。但对于IList<T>
上的二进制搜索,我建议您check out the following SO post。
我不知道一个好的,通用的算法库,你可以用来填补Linq的空白,虽然我怀疑很多人已经实现了自己的实用工具来解决类似的问题。
答案 2 :(得分:1)
在做了一些研究之后,我找到了来自Wintellect
的{{3}}库。
除了提供各种集合之外,它还提供了一个静态Algorithms
类,其中有很多算法,包括BinarySearch<T>
和SortInPlace<T>
,它们期望任何 {{1 }}
答案 3 :(得分:1)
您可以将此库用作模板:Generic Sorting Library
它仍在进行中,并不包含所有排序算法。但是,您可以将其用作模板并在其上构建。
它将一个sort()公开为IList上的扩展方法,并要求您指定排序算法和比较器。所以你的代码可以编写如下:
int[] sortingArray = { 12, 5, 2, 7, 66 };
IComparer<int> comparer = new SortComparer();
sortingArray.Sort(SortStrategy.HeapSort, comparer);
如果有帮助,请告诉我。
答案 4 :(得分:0)
可以执行以下操作:
IList<string> foo = new List<string>();
foo.Add("hi");
foo.Add("bye");
string[] foo_temp = new string[foo.Count];
foo.CopyTo(foo_temp, 0);
Array.Sort<String>(foo_temp);
foo = new List<string>(foo_temp);
答案 5 :(得分:0)
您刚刚使用OrderBy扩展方法给出了LINQ的定义。
答案 6 :(得分:0)
IndexOfKey方法&lt;&gt;在内部进行BinarySearch。
答案 7 :(得分:0)
考虑一下您正在使用的数据结构以及实际可能使用的算法。我知道你不想阅读有关集合的内容,但显然二进制搜索在链表上不起作用。你需要什么样的算法?有效的排序算法已经存在。 Linq和.NET集合应该为您提供所需的一切。
答案 8 :(得分:0)
我也遇到了这个问题。我的解决方案是使用Reflector找出List.Sort
和Array.BinarySearch
的实现,并将其重写为IList<T>
的扩展方法。
即使您不将它们作为扩展名编写,而是作为普通的静态方法(例如,如果您使用的是C#2),您也不需要确切的语法:
Algorithms<T>.Sort(items);
在普通的静态(非泛型)类Sort
中使Algorithms
成为静态泛型方法,类型推断将通过查看参数的类型来完成其余的工作:
Algorithms.Sort(items);