【问题标题】:How to get columnar minimums in a list of arrays?如何在数组列表中获得柱状最小值?
【发布时间】:2015-10-15 09:45:36
【问题描述】:

我有一个存储在列表中的双精度数组,如下所示。我想从每一列中得到最小值。我知道我可以以某种方式遍历列表并获得最小值。但是,有没有更简单的方法可以使用每列的 List.Min() 来获得相同的结果?

List<double[]> BoxCoords = new List<double[]>();

<!-----------------Console output of BoxCoords List------------------------------!>

 8.03698858873275  | -1622.419367705   | 180.603950687759   //List Entry 1
 8.03698858855283  | -1622.41905090503 | -220.203952098008  //List Entry 2 
-7.70512234523364  | -1665.73116372802 | -220.204298594721  //List Entry 3

【问题讨论】:

    标签: c# sorting multidimensional-array


    【解决方案1】:

    假设您的列是由包装数组的序数定义的,而不是由每一行中的值定义的,这里有一个使用Selectindex overload 的方法来取消透视数据(使用SelectMany),并且然后在索引上重新分组数据,之后应用Min是一种形式:

    var columnMins = BoxCoords
        .SelectMany(bc => bc.Select((v, idx) => new {Idx = idx, Val = v}))
        .GroupBy(up => up.Idx)
        .Select(grp => grp.Min(x => x.Val));
    

    如果您需要将 .ToArray() 作为 double 的数组返回,您可以在末尾添加 .ToArray()

    [-7.70512234523364,-1665.73116372802,-220.204298594721]

    演示.Net Fiddle

    【讨论】:

    • 感谢您的回答。我不知道代码实际上是如何工作的,但它对我来说很完美:)
    • 这不会返回一个匿名类型的枚举吗?
    • 基本上,我们通过将原始数据结构“转置”为一组扁平的元组,但同时记住行中的位置(使用 Select 重载)。之后,它就像在我们的索引上重新分组并应用聚合一样简单。 @Kapol,不,我只预测 x.Val 的最小值,这是一个双精度数,所以如果 OP 使用 .ToArray(),它将是 IEnumerable&lt;double&gt;double[]
    【解决方案2】:

    对于行:

    List<double[]> BoxCoords = new List<double[]>();
    var result = BoxCoords.Select(x=>x.Min()).ToList();
    

    对于列:

    var result = new List<double>();
    for (int i = 0; i < BoxCoords[0].Length; i++)//care! exception for jugged arrays
    {
        result.Add(BoxCoords.SelectMany(x => x.Skip(i).Take(1).ToList()).ToList().Min());
    }
    

    【讨论】:

    • 感谢您的快速回答。我对此进行了测试,但它返回的是一行的最小值,而不是一列。我需要每列的最小值
    猜你喜欢
    • 2013-06-11
    • 2017-05-24
    • 2018-05-15
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2015-06-20
    • 2018-09-16
    相关资源
    最近更新 更多