Добавить на условии с лямбда - PullRequest
1 голос
/ 14 марта 2012

Есть ли способ сделать что-то подобное с лямбда-выражениями?

responses.Add(sr).Where(v.Responses.TryGetValue(v.responseType, out sr));

Я хочу использовать лямбда-выражения или троичный оператор вместо типичного выражения if.

NB:

responses является типом List<string>.

v.Responses является Dictionary из <enum ResponseType, string>

v является некоторым объектом

sr - это строка.

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

То, что вы хотите сделать, это:

string sr;
if (v.Responses.TryGetValue(v.responseType, out sr))
    responses.Add(sr);

Нет способа облегчить синтаксис и получить такую ​​же производительность. Но вы могли бы сделать:

responses.AddRange( v.Responses.Where( p => p.Key == v.responseType )
                               .Select( p => p.Value ) );

Вы можете подумать о том, что делает последний, потому что это глупо ...

РЕДАКТИРОВАТЬ: причина, почему это глупо, потому что последнее выражение переводится в:

foreach(var pair in v.Responses)
{
    if (pair.Key == v.responseType)
        responses.Add(pair.Value);
}

Таким образом, если в вашем перечислении ResponseType было 6 миллионов записей, программа перебирает весь набор ключей для поиска правильной записи. В вашем случае, так как вы уже знаете ключ, вы должны использовать v.Responses[key], поскольку он чрезвычайно быстр (посмотрите, в каких случаях должны использоваться словари).

1 голос
/ 14 марта 2012

LINQ не должен изменять коллекции.

Не могли бы вы просто сделать что-то вроде этого:

  string sr;
  if(v.Responses.TryGetValue(v.responseType, out sr))
     responses.Add(sr);
0 голосов
/ 14 марта 2012

Если я правильно понимаю ваш вопрос, это может сделать то, что вы ищете.

Исходя из вашего примера кода, я предполагаю, что ваш объект "v" содержит поле с именем "responseType" типа RepsonseType.

var responses = v.Responses
    .Where(r => r.Key == v.responseType)
    .Select(r => r.Value)
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...