如何交叉多个IEnumerable?

时间:2013-02-27 00:55:43

标签: c# asp.net-mvc linq linq-to-sql ienumerable

我不明白为什么我的变量selected不包含所有TempX变量的内容。例如,在我的情况下,变量TempX包含一个SuperObject,但是当我到达第一个相交时,它就丢失了,我的View总是显示一个空列表......

顺便说一句,blablabla.ToList()是真实而复杂的linq查询。我把它说得更清楚。

谢谢,这是代码:

 public ActionResult Search(string q)
        {
            ViewBag.q = q;

            String[] strQueries = q.Split(' ');

            IEnumerable<SuperObject> selected = new List<SuperObject>();

            foreach (string str in strQueries)
            {  
                //Query 1
                IEnumerable<SuperObject> Temp1 = blablabla.ToList();

                //Query 2
                IEnumerable<SuperObject> Temp2 = blablabla2.ToList();

                //Query 3
                IEnumerable<SuperObject> Temp3 = blablabla3.ToList();

                //Query 4
                IEnumerable<SuperObject> Temp4 = blablabla4.ToList();

                selected = selected.Intersect(Temp1);
                selected = selected.Intersect(Temp2);
                selected = selected.Intersect(Temp3);
                selected = selected.Intersect(Temp4);
            }

            return View("Search", selected);
        }

2 个答案:

答案 0 :(得分:10)

您可能希望使用Union代替Intersect。这是区别,我认为它是自我解释的: Union, intersection, difference comparison.

答案 1 :(得分:0)

您正在将一个空列表与Temp 1-4相交。这不会产生任何结果。

编辑:为了详细说明,交叉获取两个集合共有的所有元素。由于您相交的第一个集合为空,因此结果始终为空。所以答案真的取决于你想要做什么。您是否只想找到所有4个列表共有的元素?如果是这样,BurundukXP说:

selected = Temp1.Intersect(Temp2);
selected = selected.Intersect(Temp3);
selected = selected.Intersect(Temp4);

您是否想要获取每个列表中所有元素的唯一列表?做这样的事情:

selected.AddRange(Temp1);
selected.AddRange(Temp2);
selected.AddRange(Temp3);
selected.AddRange(Temp4);
selected.Distinct();