我有以下代码:
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”)]
答案 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()
的使用在这里毫无意义。