C# Linq选择包含所有包含标志且没有排除标志的行
我有可以通过多对多联接表应用于多个ID的属性标志:C# Linq选择包含所有包含标志且没有排除标志的行,c#,linq,C#,Linq,我有可以通过多对多联接表应用于多个ID的属性标志: ID | Flag --------- 1 | C 2 | B 3 | B 3 | C 4 | A 5 | A 5 | C 6 | A 6 | B 7 | A 7 | B 7 | C 这涉及到: 1 C 2 B 3 BC 4 A 5 A C 6 AB 7 ABC 给定两个标志数组,Include和Exclude,我想找到所有包含标志而不包含任何排除标志的ID Include=[A,B],Exclude=[C]
ID | Flag
---------
1 | C
2 | B
3 | B
3 | C
4 | A
5 | A
5 | C
6 | A
6 | B
7 | A
7 | B
7 | C
这涉及到:
1 C
2 B
3 BC
4 A
5 A C
6 AB
7 ABC
给定两个标志数组,Include和Exclude,我想找到所有包含标志而不包含任何排除标志的ID
Include=[A,B],Exclude=[C]:结果ID=[6]
Include=[A],Exclude=[C]:结果ID=[4,6]
Include=[A],Exclude=[]:结果ID=[4,5,6,7]
我想在Linq中使用它,理想情况下应该使用查询语法
我已经尝试过创建它,但无法理解如何开始使用一组标准处理多个条目
from row in data
where
include.Contains(row.Flag) &&
!exclude.Contains(row.Flag)
select row.ID
Dictionary flags=新字典{/*…*/};
字符串[]包括=[“A”,“B”];
字符串[]不包括=[“C”];
旗帜
.GroupBy(f=>f.Id)
.其中(g=>
includes.All(i=>g.Any(f=>f.Flag==i))&&
!排除.Any(e=>g.Any(f=>f.Flag==e)))
您需要根据ID
进行分组,然后检查每个组是否包含所有包含
标志,并且没有任何排除
标志:
var q = Items.GroupBy(x => x.ID)
.Where(g => (g.Select(x => x.Flag)
.Intersect(Include)
.Count() == Include.Count())
&&
(g.Select(x => x.Flag)
.Intersect(Exclude)
.Count() == 0))
.Select(g => g.Key);
我正在使用Intersect
检查每个组中是否存在Include
/Exclude
标志
根据您的样本数据,例如:
string[] Include = new string[] { "A", "B" };
string[] Exclude = new string[] { "C" };
输出为:
[0] = 6
上述linq查询中使用的项
对象是一个列表
:
class Item
{
public int ID {get; set;}
public string Flag { get; set; }
}
我看到几个
我想要的s,但与我尝试的没有任何关联。你说的Include,exclude是什么意思?我不明白你;(你想把两个参数传递给linq查询吗:Include A,B&&Exclude D然后ID=6?@Jonesy我的非常简单的linq失败了,即Include any和Exclude none,并尝试在SQL中处理它,这通常是有帮助的,但我无法理解它。同样有效,但pluc是第一个,而且更短。
class Item
{
public int ID {get; set;}
public string Flag { get; set; }
}