我正在尝试按部门筛选用户。筛选器可能包含多个部门,用户可能属于多个部门(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魔术师对我的吸引力不强。
自从string
实现以来IEnumerable
,您现在正在做的是Intersect
on IEnumerable<char>
(即您正在检查字符串中的每个字母)。您需要;
在Item2
和上拆分,Filter
然后将它们相交。
var tuplets = users.Where(u =>
u.Item2.Split(new []{';'})
.Intersect(Filter.Split(new []{';'}))
.Any());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句