Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从排序数组中选择最多5个数字的有效方法_C#_Linq - Fatal编程技术网

C# 从排序数组中选择最多5个数字的有效方法

C# 从排序数组中选择最多5个数字的有效方法,c#,linq,C#,Linq,是否有其他最佳方法可以从3个排序数组中获取5个最大值,如下代码所示: 更新: 下面的代码给出了结果,但我不确定这是否是唯一的方法 输入数组可以包含重复项,但结果不能包含重复项 高效意味着我们在获得结果的同时需要更少的迭代 我正在寻找linq的具体答案 对3个数组重复5个合并排序步骤:这可以通过一个包含三个元素的数组来完成,该数组包含每个数组的最大值,然后找到最大值和最大值的索引。(如果索引为2(从0..2),则替换最后一个预排序数组中的该元素。) 使用linq[有效地]执行此操作的步骤可能需要以

是否有其他最佳方法可以从3个排序数组中获取5个最大值,如下代码所示:

更新:

  • 下面的代码给出了结果,但我不确定这是否是唯一的方法

  • 输入数组可以包含重复项,但结果不能包含重复项

  • 高效意味着我们在获得结果的同时需要更少的迭代

  • 我正在寻找linq的具体答案


  • 对3个数组重复5个合并排序步骤:这可以通过一个包含三个元素的数组来完成,该数组包含每个数组的最大值,然后找到最大值和最大值的索引。(如果索引为2(从0..2),则替换最后一个预排序数组中的该元素。)

    使用linq[有效地]执行此操作的步骤可能需要以下步骤--

    • 分类
    • 考虑最后五个要素

    您可以获取每个数组中的前5个元素,然后按降序排列

    var a1_5 = a1.Reverse().Take(5).Reverse();
    var a2_5 = a2.Reverse().Take(5).Reverse();
    var a3_5 = a3.Reverse().Take(5).Reverse();
    var resultArray = (a1_5.Union(a2_5)).Union(a3_5).OrderByDescending(x=>x).Take(5);
    

    这样,您的排序方法“OrderByDescending”将具有更少的处理输入和更好的性能。

    从已排序数组中找出前5个元素的最佳方法是比较每个数组的最后一个元素get max和离开前一个已创建元素的每个数组的最后一个元素

    下面是执行此任务的两种方法第一种方法仅使用基本类型,是最有效的方法,没有额外的循环,没有额外的比较,没有额外的内存消耗,只需传递需要与另一个匹配的元素的索引,并计算每个给定数组下一个要匹配的索引

    第一个是这样的:通过链接:-

    第二个是:-

    int[] Array1 = { 09, 65, 87, 89, 888 };
    int[] Array2 = { 1, 13, 33, 49, 921 };
    int[] Array3 = { 22, 44, 66, 88, 110 };
    
    int [] MergeArr = Array1.Concat(Array2).Concat(Array3).ToArray();
    Array.Sort(MergeArr);
    int [] Top5Number = MergeArr.Reverse().Take(5).ToArray() 
    

    您现在的方式有什么问题吗?它可以工作,但我不确定这是否是唯一最快的方式??在当前的形式中,代码排除了重复项。是故意的吗?是的,最终数组必须包含唯一的元素。这是一种不好的性能评估方法。首先根据客户可接受的内容设定目标,然后衡量是否达到目标。如果你已经实现了你的目标,那就花你宝贵的时间去担心其他事情。如果你还没有达到你的目标,那么就用一个分析器来找出最慢的事情并解决它。这不可能是程序中最慢的事情。+1表示最佳解决方案。OP需要唯一的值,所以算法可能需要5个以上的步骤才能完成。@DnshPly9这样问没有多大意义。如果您需要一些自定义算法,通常最好是强制编写,而不使用LINQ。这是因为LINQ不是为编写定制高效的低级算法而设计的,而且它也不擅长。但是您可以使用与LINQ兼容的方式编写它,例如
    new[]{a1,a2,a3}.Select(a=>a.Reverse()).Merge().Take(5)
    (其中
    Merge()
    是您将编写的实现合并排序的方法)。这就是你要找的吗?是的,这是一个明显的优化,但OP表示不能保证
    a1
    没有重复项。另外,最后一个倒转是毫无意义的(下一步就是排序)
    int[] Array1 = { 09, 65, 87, 89, 888 };
    int[] Array2 = { 1, 13, 33, 49, 921 };
    int[] Array3 = { 22, 44, 66, 88, 110 };
    
    int [] MergeArr = Array1.Concat(Array2).Concat(Array3).ToArray();
    Array.Sort(MergeArr);
    int [] Top5Number = MergeArr.Reverse().Take(5).ToArray()