如何在lambda表达式中使用带有out参数的方法

本文关键字:out 参数 方法 lambda 表达式 | 更新日期: 2023-09-27 18:09:36

我有一个方法,看起来像这样:

bool GetIdByName(string name, out ID id)

我想在lambda表达式中使用它,通过许多"名称"获得几个"id":

var ids = names.Select(name => idService.GetIdByName(name, out id));

在这种情况下,我会在我的'ids'变量中找到所有bool值,这不是我想要的。是否也有可能得到每个调用的输出参数"id"?

如何在lambda表达式中使用带有out参数的方法

您可以使用带有body的委托:

IEnumerable<ID> ids = names.Select
(
    name =>
    {
        ID id;
        GetName(name, out id);
        return id;
    }
);

我将把对GetIdByName的调用分解成一个方法,这样它就变得更可组合了。

var ids = names.Select(GetId);
private static ID GetId(string name)
{
    ID id;
    idService.GetIdByName(name, out id);
    return id;
}

正在寻找这样的东西吗?

var ids = names
  .Select(name => {
    ID id = null; 
    if (!idService.GetIdByName(name, out id))
      id = null; // name doesn't corresponds to any ID
    return id;
  })
  .Where(id => id != null);

如果ID结构体(因此不能为空):

  var ids = names
    .Select(name => {
      ID id = null; 
      Boolean found = idService.GetIdByName(name, out id);
      return new {
        Found = found,
        ID = id
      };
    })
    .Where(data => data.Found)
    .Select(data => data.id);