代码之家  ›  专栏  ›  技术社区  ›  Luiscencio

使用LINQ(已编辑)按两列排序。算了吧!我会把答案贴出来把事情弄清楚

  •  -2
  • Luiscencio  · 技术社区  · 15 年前

    嗨,我有一个列表,如下所示:

          val1   val2
    r1     10     3              
    r2      5     5
    r3      9     7
    r4      4     1
    r5      2     9
    r6     1000   0
    

    我需要得到两个值同时处于最大值的行,例如:

          val1   val2
    r1     10     3      no match both values can be highe
    r2      5     5      no match both values can be higher
    r3      9     7      MATCH val1 can be higher but it would make val2 lower and viceversa
    r4      4     1      no match both values can be higher
    r5      2     9      no match val2 is at its highest but val1 can be higher
    r6     1000   0      no match val1 is at its highest but val2 can be higher
    

    在这种情况下,应该是r3

    希望这次一切都清楚了

    4 回复  |  直到 15 年前
        1
  •  3
  •   Jimmy    15 年前

    不清楚你想要什么:

    1)你不想要任何一双被另一双主宰。
    2)您不需要val1最大但val2可能更高的项目,反之亦然。

    1表示您希望在集合的上边缘有一对。
    2只意味着你放弃了两个端点。

    这仍然会留下任何可能的选择

    alt text http://img341.imageshack.us/img341/1720/chartgn.png

    在上面的图表中,有2个点被严格控制,所以你取消了它们的资格。有两个满足点(x是最大值,但y可以增加,反之亦然),所以您也取消了这些条件的资格。这仍然会留下两个满足的点(不降低另一个点,x和y都不能增加)

    事实上(正如Jason在评论中指出的那样),看你的原始数据,(10,3)也满足(在不降低另一个值的情况下,Val1和Val2都不能增加)

        2
  •  2
  •   dtb    15 年前
          val1   val2   val1+val2
    r1     10     3        13
    r2      5     5        10
    r3      9     7        16    <<
    r4      4     1         5
    r5      2     9        11
    

    看起来最好的解决方案仍然是通过两个数字的和来选择最大值:

    Tuple<int,int> GetBest(IEnumerable<Tuple<int,int>> pairs)
    {
        return pairs.MaxBy(pair => pair.Item1 + pair.Item2);
    }
    

    MaxBy MoreLINQ )

        3
  •  0
  •   µBio    15 年前

    只需选择这两列中最高的一列。

        4
  •  -1
  •   Luiscencio    15 年前

    在这里:

    鉴于

         val1  val2
    r1  10    3
    r2  5     5
    r3  9     7
    r4  4     1
    r5  2     9
    r6  1000  0
    r7  5     1000
    r8  5     4
    

    按val2 asc排序

         val1  val2
    r6  1000  0
    r4  4     1
    r1  10    3
    r8  5     4
    r2  5     5
    r3  9     7
    r5  2     9
    r7  5     1000
    

    然后按val1 desc排序

         val1  val2
    r6  1000  0
    r1  10    3
    r3  9     7
    r7  5     1000
    r2  5     5
    r8  5     4
    r4  4     1
    r5  2     9 
    

    现在做s=(val1[n+1]-val1[n])/(val2[n+1]-val2[n])

    n       s
    1   -330
    2   -0.25
    3   1.333333333
    4   0
    5   0
    6   0.001001001
    7   -0.25
    8   0.222222222
    

    在这里,我们可以看到,在n=3时s更大,对应于r3(9,7)。