使用C#中的分割分区列表



如何使用此拆分列表的方法<>

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"的定义,并且找不到接受类型为"List"的第一个参数的可访问扩展方法"SplitPartition"(是否缺少using指令或程序集引用?(

我认为您最好推出自己的解决方案。假设您已经下载了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的缓冲区,并根据模写入文件名。这比在预分块时燃烧大量内存(根据所涉及的数字,分割例程的性能可能会很可怕;它不会尝试根据数字提供任何合适大小的列表(要好

至少考虑重写分块,使其使用直接的2d(jaggy(阵列或预容量供应的列表;您可以从传入列表的大小和块大小中知道它们需要的大小:


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;
}
}

看不到完整的代码,但是:

  • 扩展方法需要属于static类,并且
  • 这个类和方法需要在调用代码中可见

特别是,我可以看到你的ExportToCsv不是静态的,所以它不属于静态类,所以我可以推断你的private扩展方法是:

  • 不属于静态类,或者
  • ExportToCsv方法属于一个单独的类,因此从中看不到

因此,制作一个public static类来保存扩展方法,将方法本身标记为public static,这样您就可以开始工作了。

更多详细信息:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/how-to-implement-and-call-a-custom-extension-method

最新更新