我在列表中有以下数据: -
╔════╤════════════╤════════╗
║ Id │ EmployeeId │ Answer ║
╠════╪════════════╪════════╣
║ 1 │ 6 │ 1 ║
╟────┼────────────┼────────╢
║ 2 │ 6 │ 4 ║
╟────┼────────────┼────────╢
║ 3 │ 7 │ 2 ║
╟────┼────────────┼────────╢
║ 4 │ 7 │ 4 ║
╚════╧════════════╧════════╝
现在,使用Linq,我想得到那些已回答1和4的“EmployeeId”(在答案栏中)。
我该怎么做...... ??
修改
实际上我想要那些已经回答4但不是1的员工。 在上面的示例中,EmployeeId 7
答案 0 :(得分:2)
var answers = new[]{ 1, 4 };
var query = list
.GroupBy(x => x.EmployeeId)
.Where(g => answers.All(a => g.Any(x => x.Answer == a)))
.Select(g => g.Key);
LINQ to Objects更高效:
var query = list
.GroupBy(x => x.EmployeeId)
.Where(g => !answers.Except(g.Select(x => x.Answer)).Any())
.Select(g => g.Key);
或没有查找集合:
var query = list
.GroupBy(x => x.EmployeeId)
.Where(g => g.Any(x => x.Answer == 1) && g.Any(x => x.Answer == 4))
.Select(g => g.Key);
修改:现在您希望所有EmployeeId
的答案都是4
而不是1
:
var query = list
.GroupBy(x => x.EmployeeId)
.Where(g => g.Any(x => x.Answer == 4) && !g.Any(x => x.Answer == 1))
.Select(g => g.Key);
答案 1 :(得分:2)
使用Where
仅选择想要的答案。然后使用Select
选择员工ID。
var answers = new[]{1,4};
var result = list.Where(x => answers.Contains(x.Answer)).Select(x => x.EmployeeId).ToList();
如果您愿意,也可以使用Distinct
删除重复项。
var result = list.Where(x => answers.Contains(x.Answer)).Select(x => x.EmployeeId).Distinct().ToList();
如果你想要除1和4之外的任何答案以及其他答案
var result = list.Where(x => x.Answer != 1).Select(x => x.EmployeeId).Distinct().ToList();