留下LINQ使用的性能成本,我想知道如何将以下代码转换为LINQ表达式
for (int i = 0; i < someArray.length(); i++)
yield return new SomeEntity(someFunction(i));
重要提示:我需要使用递增的索引
更新
应使用someArray.length()
而不是number
:
for (int i = 0; i < number; i++)
yield return new SomeEntity(someFunction(i));
第二次更新
我仍然收到编译错误“并非所有代码路径都返回值”
我的代码:
public static IEnumerable function()
{
Enumerable.Range(0,5).Select(i => new Entity());
}
第3次更新
在我发现这是导致此错误的原因之前,我认为这是不相关的。
public static IEnumerable function()
{
int[] arr = { 1, 2, 3, 4 };
foreach (int i in arr)
{
Enumerable.Range(0,5).Select(i => new Entity());
}
}
如果你从方程式中取出foreach第一个循环,所有回复都回答了这个问题,但我的问题是n ^ 2 .. 2个嵌套循环......
有什么想法吗?
答案 0 :(得分:6)
使用具有集合索引的Enumerable.Select
重载:
someArray.Select((x, i) => new SomeEntity(someFunction(i)));
如果您修改了示例并且实际上并未使用集合进行迭代和索引,请使用Enumerable.Range
:
Enumerable.Range(0, number).Select(i => new SomeEntity(someFunction(i)));
答案 1 :(得分:1)
使用Enumerable.Range
生成数字:
Enumerable.Range(0,number).Select(i=>new SomeEntity(someFunction(i)));
答案 2 :(得分:0)
这是我的LinqPad片段。
void Main()
{
var e = SomeEntity.GetEntities(new List<int> { 1, 2, 3});
e.Dump();
}
public class SomeEntity
{
public int m_i;
public SomeEntity(int i)
{
m_i = i;
}
public override string ToString()
{
return m_i.ToString();
}
public static int someFunction(int i){ return i+100;}
public static IEnumerable<SomeEntity> GetEntities(IEnumerable<int> someArray)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
return someArray.Select(a => new SomeEntity(someFunction(a)));
}
}