c#linq条件联盟

时间:2010-10-11 10:51:39

标签: c# .net linq

嗨我有以下代码,并且如果条件为真,则只想使每个联合。 我知道我可以写一个if if的选择,但想知道Linq方式是否有一个更流畅的方式!?

        //join the list into one and sort by seqnumber
      SegmentList = Alist.Cast<BaseSegment>()
     .Union(BList.Cast<BaseSegment>()).Union(CList.Cast<BaseSegment>())
     .OrderBy(item => item.SegSeqNumber).ToList();

所以考虑到上面的ATest = true如果BTest&amp;&amp; amp; CTest是真的,我如何只包括BList和Clist

由于

4 个答案:

答案 0 :(得分:3)

使用复选框以LINQ样式方式执行此操作,例如:

SegmentList = Alist.Where(i => checkbox1.IsChecked).Cast<BaseSegment>()
.Union(BList.Where(i => checkbox2.IsChecked).Cast<BaseSegment>())
.Union(CList.Where(i => checkbox3.IsChecked).Cast<BaseSegment>())
.OrderBy(item => item.SegSeqNumber).ToList();

会奏效。但我认为这不是非常容易理解或有效。

答案 1 :(得分:1)

这样的东西?

SegmentList = Alist.Cast<BaseSegment>()
                   .Union(includeB ? BList.Cast<BaseSegment>() : Enumerable.Empty<BaseSegment>())
                   .Union(includeC ? CList.Cast<BaseSegment>() : Enumerable.Empty<BaseSegment>())
                   .OrderBy(item => item.SegSeqNumber)
                   .ToList();

这与原作相同(无论如何都会删除Alist中的重复项),但应该是你想要的。

对于任何超过2个条件联合,您可能需要不同的查询,例如:

var listsByCb = new Dictionary<CheckBox, MyListType>
                {{ aListBox, aList}, {bListBox, bList}, {cListBox, cList}};

var segmentList = listsByCb.Where(kvp => kvp.Key.Checked)
                           .SelectMany(kvp => kvp.Value.Cast<BaseSegment>())
                           .Distinct();
                           .OrderBy(item => item.SegSeqNumber)
                           .ToList();

答案 2 :(得分:0)

尝试类似

的内容
SegmentList = Alist.Cast<BaseSegment>().Where(z=>ATest)
     .Union(BList.Cast<BaseSegment>().Where(x=>Btest)).Union(CList.Cast<BaseSegment>().Where(c=>Ctest))
     .OrderBy(item => item.SegSeqNumber).ToList();

其中,如果相应的test为true,则每种情况下的类将返回所有元素,否则将不返回任何元素。它完全没有经过测试

答案 3 :(得分:0)

使用Where()子句,如下所示:

    //join the list into one and sort by seqnumber
  SegmentList = 
     Alist.Cast<BaseSegment>().Where(a => ATest(a))
     .Union(
        BList.Cast<BaseSegment>(.Where(b => BTest(b))
     .Union(CList.Cast<BaseSegment>().Where(c => CTest(c))
     .OrderBy(item => item.SegSeqNumber).ToList();

顺便问一下,你真的需要最后的ToList()吗?