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

时间:2015-02-03 10:05:32

标签: c# linq

我有以下代码:

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

这很有效,因为它给了我所有“新鲜”的用户对象,但是Code Analysis抱怨我不应该创建未使用的本地,所以我的问题是,有没有办法忽略参数(类似于“ _“在Haskell中。”

PS:不幸的是我的榜样不是最好的。对不起,我很抱歉。

谢谢!

更新1

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

5 个答案:

答案 0 :(得分:2)

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

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

是完全有效的代码。这取决于您的分析规则是否接受此类情况。

但是,您的代码确实非常可疑:您将用户名集合映射到用户集合,但您没有指定两者之间的直接关系:也许您想写一些类似的东西这样:

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

答案 1 :(得分:1)

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

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

}

但是,根据你的看法,它可能看起来很难看。

答案 2 :(得分:1)

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

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

但也许更好的是你自己的助手方法

static class MyEnumerable {
  IEnumberable<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);

答案 3 :(得分:0)

Select对调用它的集合执行投影,对每个元素执行指定的操作,并将转换后的结果返回到另一个集合中。如果您不需要对lambda元素执行任何操作,那么最好直接创建一个User个对象的数组。

如上所述,回答你的编辑,你可以简单地这样做:

var NewColl = new User[userNames.Length];

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

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

答案 4 :(得分:0)

我确定 是一个有效的案例,你想忽略这样的论点,但这似乎不是其中之一。如果你要为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()的使用在这里毫无意义。