2010-10-11 71 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()