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



我面临一个问题,所以我将给出所有上下文。

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

我怎么样了?

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>电子邮件

最新更新