我面临一个问题,所以我将给出所有上下文。
我从一个字符串的通用列表中得到了两个考试,每个考试都有相同的电子邮件和通过的是或否
我怎么样了?
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
都必须是肯定的,那么我就知道,对于这个认证,特定的电子邮件成功地完成了。
我被阻止了!!
换句话说,通过电子邮件对模型进行分组所有通过必须是肯定的,那么我就知道该特定电子邮件成功完成了此次认证。
听起来像,在其最基本的
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
将返回false
,而Where
将从结果中排除他们
之后它看起来像:
g => g.Key: john@a.com g: [ john@a.com Yes, john@a.com Yes]
这仍然是一个分组,所以也许你必须选择电子邮件:
.Select(g => g.Key).ToList()
这将大量产生通过的List<string>
电子邮件