【问题标题】:Compare two lists for Max value within a parameter using linq使用 linq 比较参数中最大值的两个列表
【发布时间】:2017-09-22 01:32:36
【问题描述】:

我有一个字段对象列表,参数为 (string)Name 和 (int)Size。

我还有一个 File 对象列表,每个对象都包含一个 Field 对象列表,其中一些对象可能出现在总体 Field 对象中。

我需要遍历所有的 Field 对象,并找到所有可能的 File-Field 对象的最大值。

我可以用嵌套 3 做到这一点吗? for 循环,但我想看看这在 linq 中是否可行。

List<fieldobject> mainfields;
List<fileobject> files;

在文件对象类中:

List<fieldobject> fields;

for 循环的基本概念是:

foreach (fieldobject field in mainfields)
    foreach (fileobject file in files)
        foreach (fieldobject fileField in file.fields)
            if (field.name == fileField.name)
                field.size = math.max(field.size,fileField.size);

我可以用 linq 替换 if 和 assignment,但我希望摆脱大多数/所有 for 循环。非常感谢任何帮助。

【问题讨论】:

  • 您的代码无法编译(第二次 foreach 没有意义),请提供一个最小的工作示例:stackoverflow.com/help/mcve
  • 第二个循环中的文件来自哪里?应该是field.files
  • 主类有: list mainfields list 文件 fileobject 类有: list 我必须遍历所有附加到主对象的文件,并比较它们字段到直接附加到主对象的字段。代码可能缺少一些 {},但应该可以正常工作
  • 请显示fieldobjectfileobject的定义。并且为了确保,您想要所有列表中所有项目中fieldobject.size 的最大值?
  • @Sach 是的。我的 mainfields.size 需要设置为文件列表中所有字段中的最大大小。匹配触发器是 .name

标签: c# linq


【解决方案1】:

如果我理解正确file.fields 是文件对象对象内部的文件对象的内部列表,那么您需要使用SelectMany 扩展方法:

foreach (fileobject field in mainfields)
{
    field.size = files.SelectMany(x => x.fields)
   .Where(y => y.name == field.name).Select(m => m.size).Max();
}

【讨论】:

  • 谢谢。我知道这是可能的,但我还没有 wheres 和 selects 和 select manys 下来。非常感谢!
【解决方案2】:

你可以有类似的东西;

foreach (fieldobject field in mainfields)
{
    int maxFileSize = files.Where(f => f.name == field.name)
                           .Select(f => f.size)
                           .Max();
    if (field.size < maxFileSize)
    {
         field.size = maxFileSize;
    }
}

【讨论】:

  • 我没有看到 mainFields 和 files.fields 中的 .name 有任何比较
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多