【问题标题】:How to get array of fixed length from linq?如何从linq获取固定长度的数组?
【发布时间】:2020-04-12 06:01:54
【问题描述】:

如何从 Linq 获取固定长度的数组?

我试过了,还是不行:

void Main() {
    // To Array doesn't accept int argument
    // Enumerable.Range(1, 3).ToArray(10);

    Enumerable.Range(1, 3).Take(10);
    // Result is [1,2,3], I expect [1,2,3,null,null, ..., null] or [1,2,3,0,0, ..., 0]
}

【问题讨论】:

  • Enumerable.Range(1, 3).Concat(Enumerable(0, 10 - 3)).ToArray()?
  • @KlausGütter 不,我的意思是三个只是示例,可以是 4 个、5 个或超过 10 个
  • 坦率地说,这个问题没有用。使用 Concat() 是让 LINQ 获得所需内容的最明显方法。您只需为范围的长度传递正确的值。但是让 LINQ 这样做有什么意义呢?分配一个数组然后用你想要的值初始化它是微不足道的。无论如何,数组都是用默认值填充的,所以只要填充应该是默认值,您只需要填写非默认值。你为什么问这个?您具体遇到了什么问题? “给我代码”问题在这里不受欢迎。
  • @PeterDuniho 这是 Unity3d 的问题,基本上我有 10 个插槽的库存,应该由 Unity 编辑器制作。我使用 Linq 获得了项目,但无法将其映射到插槽,因为项目可能低于或超过 10

标签: c# arrays linq


【解决方案1】:

您可以定义自己的扩展方法来将IEnumerable<T> 转换为固定长度的T[],如下所示:

static class EnumerableExtensions
{
    public static T[] ToFixedLength<T>(this IEnumerable<T> source, int length)
    {
        var result = new T[length];
        var i = 0;
        foreach (var e in source)
        {
            if (i < length)
            {
                result[i++] = e;
            }
        }
        return result;
    }
}

用法:

Enumerable.Range(1, 3).ToFixedLength(10)

【讨论】:

    【解决方案2】:

    你可以这样做。

    class Test
    {
       static void Main()
        {
            int[] data = Enumerable.Range(1, 10).Select(x => x > 3 ? 0 : x).ToArray();
            foreach (var x in data)
                Console.WriteLine(x);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2011-05-18
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多