2010-06-23 6 views
1

J'ai un Dictionary<string, bool> où la clé - ID de contrôle et de valeur - il est l'état visible pour définir:Évitez recherche double contrôle dans LINQ requête

var dic = new Dictionary<string, bool> 
{ 
    { "rowFoo", true}, 
    { "rowBar", false }, 
    ... 
}; 

Certains contrôles peuvent être null, c.-à-dic.ToDictionary(k => this.FindControl(k), v => v) ne fonctionnera pas parce que la clé peut ne soyez pas nul.

Je peux faire ensuite:

dic 
    .Where(p => this.FindControl(p.Key) != null) 
    .ForEach(p => this.FindControl(p.Key).Visible = p.Value); // my own extension method 

mais appellerai FindControl() deux fois pour chaque touche. Comment éviter la double recherche et sélectionner uniquement les touches pour lesquelles un contrôle approprié existe?

Quelque chose comme:

var c= FindControl(p.Key); 
if (c!= null) 
    return c; 

mais en utilisant LINQ.

Répondre

2
dic 
.Select(kvp => new { Control = this.FindControl(kvp.Key), Visible = kvp.Value }) 
.Where(i => i.Control != null) 
.ToList() 
.ForEach(p => { p.Control.Visible = p.Visible; }); 
3
dic.Select(p => new { Control = this.FindControl(p.Key), p.Value }) 
    .Where(p => p.Control != null) 
    .ForEach(p => p.Control.Visible = p.Value); 

... mais je voudrais simplement utiliser foreach avec une déclaration if. N'utilisez pas trop LINQ.

1

Regardez, pas de cas anonymes (guère mieux cependant, les groupes Newing-up et qui énumèrent deux fois)

IEnumerable<IGrouping<bool, Control>> visibleGroups = 
    from kvp in controlVisibleDictionary 
    let c = this.FindControl(kvp.Key) 
    where c != null 
    group c by kvp.Value; 

foreach(IGrouping<bool, Control> g in visibleGroups) 
{ 
    foreach(Control c in g) 
    { 
    c.Visible = g.Key; 
    } 
} 
  • Disclaimer, pas aussi simple comme foreach, si
0

La même idée que David, mais dans un chaîne:

(from p in new System.Collections.Generic.Dictionary<string, bool> 
{ 
    { "rowAddress", value }, 
    { "rowTaxpayerID", !value }, 
    { "rowRegistrationReasonCode", !value }, 
    { "rowAccountID", !value }, 
    { "rowAccountIDForeign", value }, 
    { "rowBankAddress", value }, 
    { "rowBankID", !value }, 
    { "rowBankSwift", value }, 
    { "rowBankAccountID", !value } 
} 
let c = this.FindControl(p.Key) 
where c != null 
select new // pseudo KeyValuePair 
{ 
    Key = c, 
    Value = p.Value 
}).ForEach(p => p.Key.Visible = p.Value); // using own ext. method