【问题标题】:How to implement a linq expression for maximum in different nodes?如何在不同节点中实现最大值的 linq 表达式?
【发布时间】:2020-09-17 08:30:54
【问题描述】:

我有以下 xml: https://pastebin.pl/view/63af9294

我应该找到最高军队参加过的那场战役的名称。 (是的,这是一项学校作业,但我没有接近)

到目前为止,我的代码如下所示:

        var q10 = (from a in
                       (from x in xdoc.Descendants("size") select x)
                    join b in
                         (from y in xdoc.Descendants("battle") select y)
                    on a equals b.Element("attacker").Element("size")
                    select new
                    {
                        size = a.Value,
                        battle = b.Element("name")
                    });

我试图先获得最高的数字,而不是按大小加入每场战斗,而不是使用 .Max(x => x.size) ,但正如你所见,我不知道如何为 2 个不同的节点或其他任何节点执行此操作。 我的意思是我可以根据军队的规模加入攻击者或防御者,但不能同时加入他们两个,除非我使用 2 个加入,但我想它可以做得更容易和更好。我不想写代码,只是需要一些提示。

【问题讨论】:

  • 如果您对对象进行排序和分组,则对象保持有序。因此,在右括号后添加到查询的末尾: .OrderByDescending(x => x.size).GroupBy(x => x.battle).Select(x => x.First()).ToList();

标签: c# xml linq


【解决方案1】:

如果我正确理解您的需求,我会这样做:

var battle = xDoc.Descendants("battle")
       .OrderByDescending(b => GetMaxBattleArmySize(b))
       .First();

GetMaxArmySize 在哪里

private static int GetMaxBattleArmySize(XElement battle)
{
    XElement attacker = battle.Element("attacker");
    XElement defender = battle.Element("defender");

    var attackerSizeEl = attacker.Element("size");
    var defenderSizeEl = defender.Element("size");

    var attackerSize = attackerSizeEl == null
            ? 0
            : int.Parse(attackerSizeEl.Value);

    var defenderSize = defenderSizeEl == null
            ? 0
            : int.Parse(defenderSizeEl.Value);

    return Math.Max(attackerSize, defenderSize);
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多