【问题标题】:New array for each N element每个 N 元素的新数组
【发布时间】:2016-07-21 19:21:22
【问题描述】:

我有一个包含 200~ 个元素的数组,我试图通过对每 N 个元素执行此操作来将该数组拆分为更小的数组,这意味着我不能使用 .take / .skip 命令,我目前已经尝试过自己有不同的解决方案:

一个 Parallel.for 和 parallel.foreach (如果我能弄清楚那将是最好的)

使用正常的 for 和 foreach 循环,但现在卡住了,我所能做的就是自己创建一个新组的静态解决方案,为 arrEtikets 中的 N 个元素创建一个新组

string[] arrEtikets = Directory.GetFiles("");

public string[] Group2()
    {
        arrEtikets.Skip(arrEtikets.Length / 10);
        return arrEtikets.Take(arrEtikets.Length / 10).ToArray();
    }

【问题讨论】:

  • 你想要一个数组吗?
  • 为什么不能使用Skip?
  • 清楚地说明您的问题。 Directory.GetFiles() 可能很慢,这是问题的核心吗?因为大家都忽略了。你是在数组而不是 List 上出售的吗?

标签: c# arrays


【解决方案1】:

您可以使用 Linq 使用 GroupBy 将数组按块大小拆分为数组列表,而不使用 Skip 或 Take:

private static List<T[]> SplitToChunks<T>(T[] sequence, int chunkSize)
{
    return sequence.Select((item, index) => new { Index = index, Item = item })
                    .GroupBy(item => item.Index / chunkSize)
                    .Select(itemPerPage => itemPerPage.Select(v => v.Item).ToArray())
                    .ToList();
}

用法:

string[] arr = Enumerable.Range(0, 1000).Select(x=> x.ToString()).ToArray();

var result = SplitToChunks(arr, 101);

【讨论】:

  • 但是我在哪里插入我的数据数组以供使用,然后是包含我所有数组的 SplitToChunks 列表?
  • @Pilsneren result 包含所有阵列的列表。你可以循环result
【解决方案2】:

典型的Skip + Take 解决方案可能是这样的:

public static IEnumerable<T[]> SplitArrayWithLinq<T>(T[] source, int size) {
  if (null == source)
    throw new ArgumentNullException("source");
  else if (size <= 0)
    throw new ArgumentOutOfRangeException("size", "size must be positive");

  return Enumerable
    .Range(0, source.Length / size + (source.Length % size > 0 ? 1 : 0))
    .Select(index => source
      .Skip(size * index)
      .Take(size)
      .ToArray());
}

如果您不允许使用 Linq(包括Skip 以及Take):

public static IEnumerable<T[]> SplitArray<T>(T[] source, int size) {
  if (null == source)
    throw new ArgumentNullException("source");
  else if (size <= 0)
    throw new ArgumentOutOfRangeException("size", "size must be positive");

  int n = source.Length / size + (source.Length % size > 0 ? 1 : 0);

  for (int i = 0; i < n; ++i) {
    T[] item = new T[i == n - 1 ? source.Length - size * i : size];

    Array.Copy(source, i * size, item, 0, item.Length);

    yield return item;
  }
}

测试(让我们将[1, 2, ... 8, 9] 数组拆分为4 项目块):

var source = Enumerable.Range(1, 9).ToArray();

var result = SplitArray(source, 4);

string report = String.Join(Environment.NewLine, 
  result.Select(item => String.Join(", ", item)));

// 1, 2, 3, 4
// 5, 6, 7, 8
// 9          // <- please, notice that the last chunk has 1 item only
Console.Write(report); 

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 2021-10-05
    • 2020-07-21
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多