通过LINQ

时间:2016-09-01 07:29:35

标签: c# linq

留下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个嵌套循环......

有什么想法吗?

3 个答案:

答案 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)));    
    }
}