Linq Group by 并获取返回所有列的特定字符串规则的所有值

Linq Group by and get all values for a specific string rule returning all columns

我遇到了问题,所以我会提供所有背景信息。

我从通用字符串列表中获得 2 个考试,每个考试都有相同的电子邮件和通过的是或否。

我怎么样了?

var list = new List<string>();

对于每个字符串,我得到一个模型的位置 0 到 13 之间的记录,工作正常

List<Participants> p = new List<Participants>();
for (var i = 0; i < list.Count; i += 13)
{
    p.Add(new Participants()
    {
        LastName = list[0 + i],
        FirstName = list[1 + i],
        AddressType = list[2 + i],
        Email = list[3 + i],
        Company = list[4 + i],
        Phone = list[5 + i],
        Street = list[6 + i],
        ZipCode = list[7 + i],
        City = list[8 + i],
        IsSiemens = isSiemens,
        Country = list[9 + i],
        Percent = list[10 + i],
        Points = list[11 + i],
        Passed = list[12 + i],
    });
}

然后这行得通,因为我知道我只有 2 个部分(考试)

var distinctList = p.GroupBy(s => s.Email).Select(s => s.First()).ToList();

var distinctList = p.GroupBy(s => s.Email).Select(s => s.Last()).ToList();

现在的问题是我可以有更多的考试,我想动态地做,所以对于每封电子邮件,我都想知道是否全部通过。换句话说,按 Email 对模型进行分组,所有 Passed 必须是是,然后我知道此认证特定电子邮件已成功完成。

我被屏蔽了!!

In another words Grouping the model by Email all Passed must be yes, then I know for this Certification that specific Email completed with success.

听起来像,最基本的

var listOfEmailsThatPassed = p
  .GroupBy(s => s.Email)
  .Where(g => g.All(pt => pt.Passed == "Yes"))
  .Select(g => g.Key)
  .ToList()

你没说Passed是什么类型;我假定为字符串,但如果它是布尔值 g.All(pt => pt.Passed).

分组可能很难让您头脑清醒,但可以将其想象成参与者列表,您有一个 .Where( 作用于分组 g,这是一个参与者列表,因此您希望分组中的 All 个参与者 pt 已通过

参加者名单(我跳过了课程名称等细节):

   john@a.com Yes
   john@a.com Yes
   fred@b.com Yes
   fred@b.com No

分组后看起来像

   g => g.Key: john@a.com   g: [ john@a.com Yes, john@a.com Yes] 
   g => g.Key: fred@b.com   g: [ fred@b.com Yes, fred@b.com No]

因此您可以使用 Where 对这两行中的每一行进行操作,并且 g 本身就是一个共享相同密钥(电子邮件)的参与者的(子)列表,因此您要求 g.All(participant => some predicate).. 这就是您测试 Passed == "Yes" 作为谓词的地方。如果有人 Passed == "No" 那么 All 将 return falseWhere 将从结果中排除他们

Where'ing 后看起来像:

   g => g.Key: john@a.com   g: [ john@a.com Yes, john@a.com Yes] 
   

它仍然是一个分组,所以也许你必须 select 电子邮件:

.Select(g => g.Key).ToList()

这将生成 List<string> 通过

的电子邮件