嗨我有以下代码,并且如果条件为真,则只想使每个联合。 我知道我可以写一个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
由于
答案 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()
吗?