在LINQ中忽略参数的正确方法是什么?

ej83mcc0  于 2023-05-04  发布在  其他
关注(0)|答案(5)|浏览(131)

我有以下代码:

foreach (var b in userNames.Select(a => new User()))
        {
          ...
        }

这很好用,因为它给了我所有“新鲜”的用户对象,但是代码分析抱怨我不应该创建未使用的局部变量,所以我的问题是,有没有一种方法可以忽略参数(类似于Haskell中的“_”)。
PS:我的例子可能不是最好的。对此我很抱歉。
谢谢!

更新1

我得到了以下代码分析错误:[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Performance”,“CA1804:RemoveUnusedLocals”,MessageId =“a”),System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Performance”,“CA1804:RemoveUnusedLocals”,MessageId =“B”)]

gab6jxml

gab6jxml1#

_C#中完全有效的变量名。所以写作

foreach(var b in userNames.Select(_ => new User()))
{
}

是完全有效的代码。这取决于您的分析规则是否接受此类情况。
然而,你的代码确实很可疑:您将一个用户名集合Map到一个用户集合,但没有指定两者之间的直接关系:也许你想写这样的东西:

foreach(var b in userNames.Select(username => new User(username)))
1zmg4dgp

1zmg4dgp2#

如果您关心数量,并且需要linq,请将其重写为

foreach(var user in Enumerable.Repeat(()=>new User(),Usernames.Count).Select(x=>x()))
{

}

但是,它可能看起来很丑,根据你如何看待它。

bd1hkmkf

bd1hkmkf3#

要创建给定大小的对象集合,只需使用原始集合的长度。

var newColletion = Enumerable.Repeat(false, input.Length)
                             .Select(_ => new User());

但最好是你自己的辅助方法

static class MyEnumerable {
  IEnumerable<T> Repeat<T>(Func<T> generator, int count) {
    for (var i = 0; i < count; ++i) {
      yield return generator();
    }
  }
}

然后使用

var newCollection = MyEnumerable.Repeat(() => new User(), oldCollection.Length);
kq4fsx7k

kq4fsx7k4#

我相信有一个有效的情况下,你会想忽略这样的论点,但这似乎不是其中之一。如果你为N个用户名创建N个User对象,你肯定想把它们耦合在一起吗?

foreach (var b in userNames.Select(a => new { name = a, user = new User() }))
{
    ...
}

这样就不会有任何未使用的参数。
但问题是,你为什么不这样做:

foreach (var name in userNames)
{
    var user = new User();
    // ...
}

在我看来,您在这里使用.Select()没有任何意义。

lh80um4z

lh80um4z5#

Select在调用它的集合上执行投影,对每个元素执行指定的操作,并在另一个集合中返回转换后的结果。如果不需要对lambda元素执行任何操作,最好直接创建一个User对象数组。
回答你的编辑,正如我上面所说,你可以简单地这样做:

var NewColl = new User[userNames.Length];

至于初始化,你可以这样做:

Enumerable.Repeat<User>(new User(), userNames.Length);

相关问题