【问题标题】:Linq list of lists to one listLinq 列表列表到一个列表
【发布时间】:2020-02-18 11:27:40
【问题描述】:

我有一个 Linq 查询,可以像这样更新每个条件组中的第一项

var results = StudentsList.GroupBy(x => x.GroupID)
    .Where(g => !g.Any(p => p.Student == "Adam") && g.Any(x => x.University == "OPQ"))
    .Select(g => 
            {
                var firstItem = g.First(x => x.University == "OPQ");
                firstItem.IsQualified = true;

                return firstItem;
            }).ToList();

在保留原有功能的同时,我想另外-

  • 如果存在,请使用University!= "OPQ"Course= "HR"(第2 组)为同一组中的所有学生更新IsQualified= true。如果不存在,则忽略(第 5 组)

输出

  • Donald、Silver、Emity(所有第 2 组)和 White(第 5 组)。

我尝试了什么

"firstItem.IsQualified = true;" 行下方,我添加了-

var otherItems=g.Any(x=>x.University != "OPQ" && x.Course =="HR");
otherItems.IsQualified= true;

我的代码

    List<StudentInfo> StudentsList = new List<StudentInfo>();

    // Group 1
    StudentsList.Add( new StudentInfo { Student="Gungun", University="cdf", Course="GD", GroupID = 1, IsQualified=false});
    StudentsList.Add( new StudentInfo { Student="John", University="abc", Course="ACC", GroupID = 1, IsQualified=false});
    StudentsList.Add( new StudentInfo { Student="Jack", University="def", Course="CS", GroupID = 1, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Peter", University="abc", Course="GD", GroupID = 1, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Lemity", University="abc", Course="CS", GroupID = 1, IsQualified=false} );

    // Group 2
    StudentsList.Add( new StudentInfo { Student="Donald", University="def", Course="HR",GroupID = 2, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Olivia", University="ggh", Course="RC",GroupID = 2, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Silver", University="tcs", Course="HR",GroupID = 2, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Carl", University="yyz", Course="AC",GroupID = 2, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Emity", University="OPQ", Course="AC",GroupID = 2, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Emma", University="OPQ", Course="GD", GroupID = 2, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Alan", University="OPQ", Course="GD", GroupID = 2, IsQualified=false} );

    // Group 3
    StudentsList.Add( new StudentInfo { Student="Adam", University="yub", Course="CS", GroupID = 3, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Jacob", University="OPQ", Course="AC",GroupID = 3, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Matthew", University="OPQ", Course="HR", GroupID = 3, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Saint", University="abc", Course="MNGT",  GroupID = 3, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Joshua", University="qer", Course="MNGT",  GroupID = 3, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Aubrey", University="fef", Course="MNGT",  GroupID = 3, IsQualified=false} );

    // Group 4
    StudentsList.Add( new StudentInfo { Student="Caleb", University="DEF", Course="HR", GroupID = 4, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Anna", University="ABC", Course="HR", GroupID = 4, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Chill", University="GHI", Course="GD", GroupID = 4, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Alexis", University="JKL", Course="CS", GroupID = 4, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="Zoe", University="MNO", Course="MNGT", GroupID = 4, IsQualified=false} );

    // Group 5
    StudentsList.Add( new StudentInfo { Student="Dylan", University="PQR", Course="ACC", GroupID = 5, IsQualified=false} );
    StudentsList.Add( new StudentInfo { Student="White", University="OPQ", Course="CE", GroupID = 5, IsQualified=false} );

public class StudentInfo
{
  public string Student { get; set; }
  public string University { get; set; }
  public string Course { get; set; }
  public int GroupID { get; set; }
  public bool IsQualified {get; set;}
}

【问题讨论】:

  • Course="GD", Course="ACC" -(第 13 行,第 90 列)成员“Course”的重复初始化是不言自明的。
  • 抱歉标签。我已将其删除。
  • 修复后,我现在得到编译错误(第 67 行,第 18 列):'bool' 不包含'IsQualified' 的定义,并且没有扩展方法'IsQualified' 接受类型的第一个参数'布尔'
  • var otherItems=g.Any(...); otherItems.IsQualified= true; - 变量 otherItems 具有 bool 类型。 bool 中没有 IsQualified 属性
  • Any 更改为Where 并在循环中更新IsQualified

标签: c# arrays list linq


【解决方案1】:

Demo on dotnet fiddle

不用.Select(),也可以用SelectMany来实现。

    var results = StudentsList.GroupBy(x => x.GroupID)
                              .Where(g => !g.Any(p => p.Student == "Adam") && g.Any(x => x.University == "OPQ"))
                              .SelectMany(g => 
                                    {
                                        var firstItem = g.First(x => x.University == "OPQ");
                                        firstItem.IsQualified = true;

                                        var otherItems = g.Where(x => x.University != "OPQ" && x.Course == "HR")
                                                          .Select(z => 
                                                                  {
                                                                      var item = z;
                                                                      item.IsQualified = true;
                                                                      return item;
                                                                  }).ToList();
                                        otherItems.Add(firstItem);
                                        return otherItems;
                                    }).ToList();

输出

Group:2 Student:Donald IsQualified:True
Group:2 Student:Silver IsQualified:True
Group:2 Student:Emity IsQualified:True
Group:5 Student:White IsQualified:True

【讨论】:

  • 如果我们在GroupBy(x =&gt; x.GroupID) 行中使用字母x,我们是否也必须在.Any(x =&gt; x.University == "OPQ") 中使用相同的字母?使用相同的字母是否有特定的目的,或者我们可以使用我们选择的任何字母?
  • 我们可以使用我们选择的任何字母
【解决方案2】:

你可以试试这个:

        var otherItems = StudentsList.Where(x => x.University != "OPQ" && x.Course == "HR");
        foreach (var otherItem in otherItems)
        {
            otherItem.IsQualified = true;
        }

【讨论】:

  • 为了使用ForEach() 方法而创建列表ToList() 是邪恶的。只需使用foreach 循环
  • @ASh 我删除了 .ToList(),现在我收到一个错误:'System.Collections.Generic.IEnumerable' 不包含 'ForEach' 的定义并且没有扩展方法'ForEach' 接受第一个参数..
  • 只使用foreach循环
  • @YoKidYo,让我按照 ASh 的建议更新答案
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2012-05-31
  • 1970-01-01
相关资源
最近更新 更多