Избегайте двойного контроля поиска в запросе LINQ - PullRequest
1 голос
/ 24 июня 2010

У меня есть Dictionary<string, bool>, где ключ - идентификатор и значение элемента управления - это видимый статус для установки:

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.

Ответы [ 4 ]

3 голосов
/ 24 июня 2010
dic.Select(p => new { Control = this.FindControl(p.Key), p.Value })
   .Where(p => p.Control != null)
   .ForEach(p => p.Control.Visible = p.Value);

... но я бы просто использовал foreach с оператором if. Не злоупотребляйте LINQ.

2 голосов
/ 24 июня 2010
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; });
1 голос
/ 24 июня 2010

Посмотрите, нет анонимных экземпляров (хотя лучше, групп обновлений и двухкратного перечисления)

0 голосов
/ 24 июня 2010

Та же идея, что и у Давида, но в одной строке:

(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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...