2010-06-23 110 views
1

我有一個Dictionary<string, bool>,其中關鍵 - 控件的ID和價值 - 它是可見的狀態設置:避免在LINQ查詢雙控搜索

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

一些控件可以null,即dic.ToDictionary(k => this.FindControl(k), v => v)不起作用,因爲鍵還可以不能爲空。

我可以做下一個:

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

,但是這將調用FindControl()兩次,每次關鍵。

如何避免重複搜索並只選擇那些適合控制的鍵?

喜歡的東西:

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

但使用LINQ。

回答

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

...但我會簡單地使用foreachif聲明。不要過度使用LINQ。

1

看,沒有匿名實例(幾乎沒有更好雖然,newing行動組和枚舉兩次)

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; 
    } 
} 
  • 聲明,還不如簡單的一個foreach,如果
0

同樣的想法,然後大衛的,但在一個字符串:

(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