Список разделенных разделов в C# - PullRequest
0 голосов
/ 28 февраля 2020

как я могу использовать этот метод разделения списка <>

private List<List<T>> SplitPartition<T>(this IEnumerable<T> collection, int size)
{
    var chunks = new List<List<T>>();
    var count = 0;
    var temp = new List<T>();

    foreach (var element in collection)
    {
        if (count++ == size)
        {
            chunks.Add(temp);
            temp = new List<T>();
            count = 1;
        }
        temp.Add(element);
    }
    chunks.Add(temp);

    return chunks;
}

Я хочу реализовать этот раздел списка в моем существующем коде:

public void ExportToCsv()
{
    List<GenerateModel> members = getDataTop5000(); // I got data from my List of Data with return List<>

    int offset = 0;
    const int numberPerBatch = 500000; // count parameter.
    double LoopMax = Math.Ceiling(members.Count / (double)numberPerBatch);

    var PartitionMembers = members.SplitPartition(numberPerBatch); //error here

    while (offset < LoopMax)
    {
        //do the index of partion here  PartitionMembers

        offset++;
    }
}

любое предложение или пример, как использовать этот метод? это действительно то, что мне нужно раздел в моем списке. Когда я попытался использовать этот метод, я получил ошибку, подобную этой:

List 'не содержит определения для «SplitPartition», и ни один доступный метод расширения «SplitPartition», принимающий первый аргумент типа «List», не может быть найденным (вам не хватает директивы using или ссылки на сборку?)

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Я думаю, вам лучше откатить собственное решение для этого. Скажем, вы загрузили 5000 участников и хотите записать их в файл из 50 блоков (100 файлов), вы можете просто сделать:

StringBuilder sb = new StringBuilder(10000);
int x= 0;
foreach(var m in members){
  if(++x%50 == 0){
    File.WriteAllText(sb.ToString(), $@"c:\temp\{x%50}.csv");
    sb.Length = 0;
  }
  sb.AppendLine(m.ToCsvRepresentationEtc());
}

Я хочу сказать не о записи в файл, это о знании того, что вы хотите сделать (например, записать в файл) со своими чанками, и о том, как сделать один проход из перечислимого, а также о том, как сделать разрезание на чанки за этот проход, изменив то, что вы делаете время от времени. В этом примере изменение действия является простым модулем, который очищает буфер StringBuilder и записывает в имя файла, основанное на модуле. Это предпочтительнее, чем сжигание большого количества памяти (выполнение этой процедуры разделения может быть ужасающим c в зависимости от используемых чисел; она не пытается подготовить какой-либо список подходящего размера на основе чисел) при предварительном разбиении его на части

По крайней мере, подумайте о переписывании чанкинга так, чтобы он использовал прямые 2d (неровные) массивы или списки с предустановленной емкостью; Вы знаете, какими они должны быть размерами, исходя из размера передаваемого в List и размера чанка:


public static class ListExtensions{

  public List<List<T>> SplitPartition<T>(this IEnumerable<T> collection, int size)
  {
    var chunks = new List<List<T>>(collection.Count/size + 1);
    var temp = new List<T>(size);

    foreach (var element in collection)
    {
        if (temp.Count == size)
        {
            chunks.Add(temp);
            temp = new List<T>(size);
        }
        temp.Add(element);
    }
    chunks.Add(temp);

    return chunks;
  }
}
2 голосов
/ 28 февраля 2020

Не могу увидеть ваш полный код, но:

  • методы расширения должны принадлежать static классам, а
  • этот класс и метод должны быть видны из вызывающий код.

В частности, я вижу, что ваш ExportToCsv не является stati c, поэтому он не относится к классу stati c, поэтому я могу сделать вывод, что ваш Метод расширения private либо:

  • не принадлежит классу stati c, либо
  • относится к отдельному классу, чем ваш метод ExportToCsv, и, следовательно, может из этого не видно

Так что создайте класс public static для хранения метода расширения, отметьте сам метод public static, и вы должны быть в бизнесе.

Подробнее детали: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/how-to-implement-and-call-a-custom-extension-method

...