通过LINQ从索引迭代中获得返回值

本文关键字:返回值 迭代 LINQ 索引 通过 | 更新日期: 2023-09-27 18:05:01

抛开使用LINQ的性能成本,我想知道如何将以下代码转换为LINQ表达式

for (int i = 0; i < someArray.length(); i++)
  yield return new SomeEntity(someFunction(i));
重要:我需要使用递增索引
更新:

应该使用number而不是someArray.length():

for (int i = 0; i < number; i++)
  yield return new SomeEntity(someFunction(i));

2日更新

我仍然得到编译错误"不是所有的代码路径返回值"

我代码:

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嵌套循环…

任何想法?

通过LINQ从索引迭代中获得返回值

使用具有集合索引的Enumerable.Select的重载:

someArray.Select((x, i) => new SomeEntity(someFunction(i)));

编辑

当您修改了示例并且实际上没有使用集合来迭代和索引时,请使用Enumerable.Range:

Enumerable.Range(0, number).Select(i => new SomeEntity(someFunction(i)));

使用Enumerable.Range生成数字:

Enumerable.Range(0,number).Select(i=>new SomeEntity(someFunction(i)));

这是我的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)));    
    }
}