我有5000个项目list
,使用自定义算法排序
我只需要最好的一个,即排序完成后list[0]
。
所以我需要一个算法来获取列表的第一项,将它与第二项进行比较,然后比较这两项中较好的一项,第三项等。只需一个循环遍历整个列表(顺序n)
我应该在c#中使用哪种排序方法来实现这种相当常见的场景?
我相信我目前使用的Sort(..)
算法是非常低效的。
答案 0 :(得分:3)
您可以使用MoreLINQ's MaxBy()
。
根据您定义“最佳”的方式,您指定的选择器参数可能不同。
示例:您有一个字符串列表,“最佳值”是最长的字符串。
string longestString = listOfStrings.MaxBy(x => x.Length);
从链接的实现中可以看出,这是O(n)
。这是未排序集合的最佳选择。
答案 1 :(得分:0)
我发现MoreLinq的MaxBy
选项,投影,源和键有点过于复杂,只是使用我自己的代码作为扩展方法:
public static T GetBest<T>(this List<T> list, IComparer<T> comparer)
{
if (list == null) throw new ArgumentNullException("list");
if (comparer == null) throw new ArgumentNullException("comparer");
if (list.Count > 0)
{
T best = list[0];
for (int i = 1; i < list.Count; i++)
{
if (comparer.Compare(best, list[i]) > 0)
{
best = list[i];
}
}
return best;
}
return default(T);
}