2010-10-11 69 views
1

您好我有以下代码,并希望只有每个联合,如果条件为真。 我知道我可以写一个选择,但是想知道是否有一个闪烁的Linq方式!?c#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 =真我怎么只iclude ALIST像明智的,如果BTEST & & CTEST是真实的我怎么只包括BList和CLIST

感谢

+4

你在说什么测试?你的代码什么都没显示 – leppie 2010-10-11 10:53:11

+1

非常不清楚。 – Kobi 2010-10-11 10:54:21

+0

是一些更具体的 – 2010-10-11 10:57:42

回答

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(); 

会工作。但我认为这不是很理解或有效。

+0

谢谢你所有的答案我认为他们都工作,但选择了亚历克斯的 – Adrian 2010-10-11 11:21:34

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(); 
+0

+1:似乎有比我和其他人更好的性能特点(最多只有一个检查运行每个联盟),也是很好的'SelectMany'例子。 – 2010-10-11 11:18:49

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(); 

,其中在每种情况下类将返回,如果所有元素相应的测试是真实的,否则将不返回任何元素。它没有经过充分测试,虽然

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()