使用Lambda添加条件

时间:2012-03-13 22:17:49

标签: c# linq lambda

有没有办法用Lambda表达式做这样的事情?

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

我想使用lambda表达式或三元运算符而不是典型的if表达式。

NB:

responsesList<string>类型。

v.ResponsesDictionary

<enum ResponseType, string>

v是某个对象

sr是一个字符串。

3 个答案:

答案 0 :(得分:2)

您想要做的是:

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枚举有600万个条目,程序将迭代整个键集以找到正确的条目。在您的情况下,由于您已经知道密钥,因此您应该使用v.Responses[key],因为它非常快(请参阅必须使用字典的情况)。

答案 1 :(得分:1)

LINQ不应该修改集合。

难道你不能简单地做这样的事情:

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

答案 2 :(得分:0)

如果我理解你的问题,这可能就是你要找的。

根据您的示例代码,我假设您的对象“v”包含RepsonseType类型的名为“responseType”的字段。

var responses = v.Responses
    .Where(r => r.Key == v.responseType)
    .Select(r => r.Value)
    .ToList();