C#中的通用集合算法

时间:2009-07-22 13:24:11

标签: c# .net algorithm generics

.NET是否有通用收集算法库?我希望能够写出这样的东西:

IList<T> items = GetItemsFromSomeWhere();
Algorithms<T>.Sort(items);
//
// ....
//
T item = GetItemSomwHow();
int i = Algorithms<T>.IndexOf(items, item);

请注意,items不是List<T>,否则我只能使用List<T>.SortList<T>.BinarySearch方法。

当然,我可以自己实施,我只是不想重新发明轮子。

我也希望实施效率很高。

P.S。

请不要建议使用哪些收藏品。我完全了解ArrayList<T>能力。我需要的是一个算法库,可用于任何基于IList<T>的集合。

修改 找到我需要的东西 - 看看我自己的答案。

9 个答案:

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

Array课程可能适合您(SortIndexOf)。

可以执行以下操作:

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)

SortedList的

IndexOfKey方法&lt;&gt;在内部进行BinarySearch。

答案 7 :(得分:0)

考虑一下您正在使用的数据结构以及实际可能使用的算法。我知道你不想阅读有关集合的内容,但显然二进制搜索在链表上不起作用。你需要什么样的算法?有效的排序算法已经存在。 Linq和.NET集合应该为您提供所需的一切。

答案 8 :(得分:0)

我也遇到了这个问题。我的解决方案是使用Reflector找出List.SortArray.BinarySearch的实现,并将其重写为IList<T>的扩展方法。

即使您不将它们作为扩展名编写,而是作为普通的静态方法(例如,如果您使用的是C#2),您也不需要确切的语法:

Algorithms<T>.Sort(items);

在普通的静态(非泛型)类Sort中使Algorithms成为静态泛型方法,类型推断将通过查看参数的类型来完成其余的工作:

Algorithms.Sort(items);