使用linq进行分组但在结果中省略某些项目

时间:2013-10-04 13:01:17

标签: c# .net linq

我有以下代码(如果你有linqpad,你可以复制粘贴并运行代码)

   void Main()
    {
        List<data_item> itemlist1= new List<data_item>();
        List<data_item> itemlist2= new List<data_item>();

        itemlist1.Add(new UserQuery.data_item 
        {
         id=1,
         LeftHasdata=true 

        })
        ;
        itemlist1.Add(new UserQuery.data_item 
        {
         id=2,
         LeftHasdata=false 

        })
        ;

        itemlist2.Add(new UserQuery.data_item 
        {
         id=2,

          RightHasData=false 
        })
        ;
        itemlist2.Add(new UserQuery.data_item 
        {
         id=1,

          RightHasData=false 
        })
        ;
        itemlist2.Add(new UserQuery.data_item 
        {
         id=3,

          RightHasData=false 
        })
        ;



        //var result= itemlist1.Concat(itemlist2).GroupBy(p=>p.id).Select(s  => new UserQuery.data_item {
        var result= itemlist1.Union(itemlist2).GroupBy(p=>p.id).Select(s  => new UserQuery.data_item {
          id=s.Key,
          LeftHasdata=s.Where(rd=>rd.LeftHasdata!=null).Select(d=>d.LeftHasdata).FirstOrDefault(),
           RightHasData=s.Where(rd=>rd.RightHasData!=null).Select(d=>d.RightHasData).FirstOrDefault(),
           })

           ;
        result.Dump();

    }

// Define other methods and classes here

 public class data_item
 {
     public int id {get;set;}
     public bool? LeftHasdata  { get; set; }
     public bool? RightHasData { get; set; }

}

我得到以下结果:

>id LeftHasdata RightHasData 

>1 True False 

>2 False False 

>3 null  False 

我只想返回组中有多个元素的结果。这意味着不应返回最后一个结果行。我如何调整我的查询来实现这一目标。

非常感谢提前

2 个答案:

答案 0 :(得分:2)

只需添加Where子句

即可
var result = itemlist1.Union(itemlist2)
                      .GroupBy(p => p.id)
                      .Where(g => g.Count() > 1)
                      ...

答案 1 :(得分:0)

最短的答案是只有一个元素的过滤器组:

itemlist1.Union(itemlist2).GroupBy(p=>p.id).Where(g=>g.Count()==2).Select ...