2010-10-11 7 views
1

hi J'ai le code suivant et je souhaite ne faire que chaque union si une condition est vraie. Je sais que je pourrais écrire un choix de sinon, mais je voulais savoir s'il y a une façon Linq Slicker !?C# linq union conditionnelle

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

Donc, étant donné ci-dessus si ATest = true comment puis-je ne iclude Alist comme sage si btest & & CTest sont vraies comment puis-je inclure seulement Blist et clist

Merci

+4

De quels tests parlez-vous? Votre code ne montre rien. – leppie

+1

Extrêmement peu clair. – Kobi

+0

être plus spécifique –

Répondre

3

Pour le faire d'une manière de style LINQ avec vos cases à cocher, quelque chose comme:

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

fonctionnerait. Mais je ne pense pas que ce soit très compréhensible ou efficace.

+0

MERCI à tous pour les réponses je pense qu'ils fonctionnent tous mais ont sélectionné – Adrian

1

Quelque chose comme ça?

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

Ce n'est pas identique à votre original (il supprimer les doublons de Alist peu importe), mais devrait être ce que vous voulez.

Pour tout plus de 2 syndicats conditionnels, vous auriez probablement besoin d'un autre requête, quelque chose comme:

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

d'Alex +1: semble avoir de meilleures caractéristiques de performance que la mienne et d'autres (au maximum, un seul chèque est exécuté pour chaque union), aussi un bel exemple 'SelectMany'. –

0

essayer quelque chose comme

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

où la classe dans chaque cas retournera tous les éléments si le test correspondant est vrai et ne retournera aucun élément autrement. son complètement non testé si

0

Utilisez une clause Where() pour cela, comme suit:

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

Soit dit en passant, avez-vous vraiment besoin de la dernière ToList()?