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 false
而 Where
将从结果中排除他们
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>
通过
的电子邮件
我遇到了问题,所以我会提供所有背景信息。
我从通用字符串列表中获得 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 false
而 Where
将从结果中排除他们
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>
通过