C# Linq intersect根据列表筛选多个条件

C# Linq intersect根据列表筛选多个条件,c#,linq,intersect,C#,Linq,Intersect,我正在尝试按部门筛选用户。过滤器可能包含多个部门,用户可能属于多个部门(n:m)。我在摆弄林克,但找不到解决办法。下面的示例代码使用简化的元组,只是为了使其可运行,当然还有一些真实的用户对象 同样在CSSharpPad上,因此您有一些可运行的代码: 我希望它返回的是:迈耶,绿色,棕色。如果Filter设置为“Dep1;Dep2”我想做一个or比较,找到*Meyer,Jackson,Green,Brown”(以及distinct,因为我不想让绿色出现两次)。如果Filter设置为“Dep2”我只想

我正在尝试按部门筛选用户。过滤器可能包含多个部门,用户可能属于多个部门(n:m)。我在摆弄林克,但找不到解决办法。下面的示例代码使用简化的
元组
,只是为了使其可运行,当然还有一些真实的用户对象

同样在CSSharpPad上,因此您有一些可运行的代码:

我希望它返回的是:迈耶,绿色,棕色。如果
Filter
设置为
“Dep1;Dep2”
我想做一个or比较,找到*Meyer,Jackson,Green,Brown”(以及distinct,因为我不想让绿色出现两次)。如果
Filter
设置为
“Dep2”
我只想要Jackson,Green。我还玩了
.Split(“;”)
,但这对我毫无帮助

我说得通吗?我有一个/多个部门的用户,希望对这些部门进行筛选。在我的输出中,我希望所有用户都来自指定的部门。LINQ魔法对我来说不是那么强大。

string[]Filter={“Dep1”,“Dep2”};//如果这是一个可枚举的,那么就更容易了
        string[] Filter = {"Dep1","Dep2"}; //Easier if this is an enumerable
        var users = new List<Tuple<string, string>>
        {
            Tuple.Create("Meyer", "Dep1"),
            Tuple.Create("Jackson", "Dep2"),
            Tuple.Create("Green", "Dep1;Dep2"),
            Tuple.Create("Brown", "Dep1")
        };

        //I would use Any/Split/Contains
        var tuplets = users.Where(u => Filter.Any(y=> u.Item2.Split(';').Contains(y)));


        if (tuplets.Distinct().ToList().Count > 0)
        {
            foreach (var item in tuplets) Console.WriteLine(item.ToString());
        }
        else
        {
            Console.WriteLine("No results");
        }
var users=新列表 { Tuple.Create(“Meyer”、“Dep1”), Tuple.Create(“Jackson”、“Dep2”), Tuple.Create(“绿色”、“Dep1;Dep2”), Tuple.Create(“Brown”、“Dep1”) }; //我会使用任何/Split/Contains var tuplets=users.Where(u=>Filter.Any(y=>u.Item2.Split(“;”).Contains(y)); if(tuplets.Distinct().ToList().Count>0) { foreach(tuplets中的var项)Console.WriteLine(item.ToString()); } 其他的 { 控制台。WriteLine(“无结果”); }
string[]Filter={“Dep1”,“Dep2”};//如果这是可枚举的,则更容易
var users=新列表
{
Tuple.Create(“Meyer”、“Dep1”),
Tuple.Create(“Jackson”、“Dep2”),
Tuple.Create(“绿色”、“Dep1;Dep2”),
Tuple.Create(“Brown”、“Dep1”)
};
//我会使用任何/Split/Contains
var tuplets=users.Where(u=>Filter.Any(y=>u.Item2.Split(“;”).Contains(y));
if(tuplets.Distinct().ToList().Count>0)
{
foreach(tuplets中的var项)Console.WriteLine(item.ToString());
}
其他的
{
控制台。WriteLine(“无结果”);
}
string[]Filter={“Dep1”,“Dep2”};//如果这是可枚举的,则更容易
var users=新列表
{
Tuple.Create(“Meyer”、“Dep1”),
Tuple.Create(“Jackson”、“Dep2”),
Tuple.Create(“绿色”、“Dep1;Dep2”),
Tuple.Create(“Brown”、“Dep1”)
};
//我会使用任何/Split/Contains
var tuplets=users.Where(u=>Filter.Any(y=>u.Item2.Split(“;”).Contains(y));
if(tuplets.Distinct().ToList().Count>0)
{
foreach(tuplets中的var项)Console.WriteLine(item.ToString());
}
其他的
{
控制台。WriteLine(“无结果”);
}
string[]Filter={“Dep1”,“Dep2”};//如果这是可枚举的,则更容易
var users=新列表
{
Tuple.Create(“Meyer”、“Dep1”),
Tuple.Create(“Jackson”、“Dep2”),
Tuple.Create(“绿色”、“Dep1;Dep2”),
Tuple.Create(“Brown”、“Dep1”)
};
//我会使用任何/Split/Contains
var tuplets=users.Where(u=>Filter.Any(y=>u.Item2.Split(“;”).Contains(y));
if(tuplets.Distinct().ToList().Count>0)
{
foreach(tuplets中的var项)Console.WriteLine(item.ToString());
}
其他的
{
控制台。WriteLine(“无结果”);
}

由于
字符串
实现了
IEnumerable
,所以您现在要做的是在
IEnumerable
上进行
相交
(即,您正在检查字符串中的每个字母)。您需要在
上进行拆分;
项目2
过滤器上进行相交

var tuplets = users.Where(u => 
    u.Item2.Split(new []{';'})
    .Intersect(Filter.Split(new []{';'}))
    .Any());

由于
string
实现了
IEnumerable
,所以您现在要做的是在
IEnumerable
上进行
相交(即检查字符串中的每个字母)。您需要在
上进行拆分;
Item2
过滤器上进行相交

var tuplets = users.Where(u => 
    u.Item2.Split(new []{';'})
    .Intersect(Filter.Split(new []{';'}))
    .Any());

由于
string
实现了
IEnumerable
,所以您现在要做的是在
IEnumerable
上进行
相交(即检查字符串中的每个字母)。您需要在
上进行拆分;
Item2
过滤器上进行相交

var tuplets = users.Where(u => 
    u.Item2.Split(new []{';'})
    .Intersect(Filter.Split(new []{';'}))
    .Any());

由于
string
实现了
IEnumerable
,所以您现在要做的是在
IEnumerable
上进行
相交(即检查字符串中的每个字母)。您需要在
上进行拆分;
Item2
过滤器上进行相交

var tuplets = users.Where(u => 
    u.Item2.Split(new []{';'})
    .Intersect(Filter.Split(new []{';'}))
    .Any());

除了其他答案外,
包含
扩展方法也可能非常适合您在匹配某个值时尝试执行的操作:

var result = list.Where(x => filter.Contains(x.Value));
否则,
Any
方法将接受委托:

var result = list.Where(x => filter.Any(y => y.Value == x.Value));

除了其他答案外,
包含
扩展方法也可能非常适合您在匹配某个值时尝试执行的操作:

var result = list.Where(x => filter.Contains(x.Value));
否则,
Any
方法将接受委托:

var result = list.Where(x => filter.Any(y => y.Value == x.Value));

除了其他答案外,
包含
扩展方法也可能非常适合您在匹配某个值时尝试执行的操作:

var result = list.Where(x => filter.Contains(x.Value));
否则,
Any
方法将接受委托:

var result = list.Where(x => filter.Any(y => y.Value == x.Value));

除了其他答案外,
包含
扩展方法也可能非常适合您在匹配某个值时尝试执行的操作:

var result = list.Where(x => filter.Contains(x.Value));
否则,
Any
方法将接受委托: