使用linq从容器中选择最高值元素,使它们添加到x

时间:2015-07-08 02:35:10

标签: c# linq list tuples

我有一个3大小的元组列表 - 其中两个是数据,一个是该数据的'值'。

我想获得符合某些总值的最高价值元素。

1 个答案:

答案 0 :(得分:1)

您可以在Linq中使用Max

var tuples = new List<Tuple<string, string, int>>()
{
    new Tuple<string, string, int>("a.1", "a.2", 50),
    new Tuple<string, string, int>("b.1", "b.2", 70),
    new Tuple<string, string, int>("c.1", "c.2", 40),
};
var matches = GetHighestTuples(tuples, 150); // returns 50 and 70

更新:添加了过滤元组列表的功能,使得最少数量的元组需要小于或等于给定的最大值,如下面的评论中所述。

要完成此操作,您必须先按第三个值按降序对它们进行排序,然后保持一个运行总计,直到达到所需的总和,同时保持原始元组值,以便一旦达到所需的运行总计,就可以变换回来只返回所描述的原始元组。

    public List<Tuple<string, string, int>> GetHighestTuples(List<Tuple<string, string, int>> tuples, int maxSum)
    {
        int runningTotal = 0;
        var results = tuples
            .OrderByDescending(t => t.Item3)
            .Select(t => new
                {
                    Item = t,
                    RunningTotal = (runningTotal += t.Item3)
                })
            .Where(t => t.RunningTotal <= maxSum)
            .Select(t => t.Item)
            .ToList();
        return results;
    }