Linq相交以针对列表过滤多个条件

丹尼斯·G。

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

同样在CSSharpPad上,因此您具有一些可运行的代码:http ://csharppad.com/gist/34be3e2dd121ffc161c4

string Filter = "Dep1"; //can also contain multiple filters
var users = new List<Tuple<string, string>>
{
    Tuple.Create("Meyer", "Dep1"),
    Tuple.Create("Jackson", "Dep2"),
    Tuple.Create("Green", "Dep1;Dep2"),
    Tuple.Create("Brown", "Dep1")
};

//this is the line I can't get to work like I want to
var tuplets = users.Where(u => u.Item2.Intersect(Filter).Any());


if (tuplets.Distinct().ToList().Count > 0)
{
    foreach (var item in tuplets) Console.WriteLine(item.ToString());
}
else
{
    Console.WriteLine("No results");
}

现在它返回:

(Meyer, Dep1)
(Jackson, Dep2)
(Green, Dep1;Dep2)
(Brown, Dep1)

我希望它返回的是:Meyer,Green,Brown如果Filter将其设置为“"Dep1;Dep2"我”,则希望进行“或”比较,并找到* Meyer,Jackson,Green,Brown”(以及不同的,因为我不想两次使用Green。)。如果Filter将其设置为“"Dep2"我只想有杰克逊,格林,我也一起玩.Split(';'),但我无处可去。

我有道理吗?我有具有单个/多个部门的用户,并且想要为这些部门进行过滤。在我的输出中,我希望所有来自指定部门的用户。LINQ魔术师对我的吸引力不强。

戴夫·齐奇(Dave Zych)

自从string实现以来IEnumerable,您现在正在做的是Intersecton IEnumerable<char>(即您正在检查字符串中的每个字母)。您需要;Item2上拆分Filter然后将它们相交。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章