C# 如何将一个集合划分为不同的“集合”;“桶”;

C# 如何将一个集合划分为不同的“集合”;“桶”;,c#,C#,我有一个C#对象的集合。对于数据成员,每个对象都有一个guid字符串、一个int索引和一个文档名字符串。以下是一个典型集合的外观: "guid1","c:\temp\doc1.docx",1 "guid1","c:\temp\doc2.docx",2 "guid1","c:\temp\doc3.docx",3 "guid1","c:\temp\doc4.docx",4 "guid2","c:\temp\doc5.docx",5 "guid1","c:\temp\doc6.docx",6 "gui

我有一个C#对象的集合。对于数据成员,每个对象都有一个guid字符串、一个int索引和一个文档名字符串。以下是一个典型集合的外观:

"guid1","c:\temp\doc1.docx",1
"guid1","c:\temp\doc2.docx",2
"guid1","c:\temp\doc3.docx",3
"guid1","c:\temp\doc4.docx",4
"guid2","c:\temp\doc5.docx",5
"guid1","c:\temp\doc6.docx",6
"guid1","c:\temp\doc7.docx",7


I need to end up breaking the collection into individual collections like this:

"guid1","c:\temp\doc1.docx",1
"guid1","c:\temp\doc2.docx",2
"guid1","c:\temp\doc3.docx",3
"guid1","c:\temp\doc4.docx",4


"guid2","c:\temp\doc5.docx",5


"guid1","c:\temp\doc6.docx",6
"guid1","c:\temp\doc7.docx",7
然后,这些单独的集合将被送入另一个函数进行处理。尝试找出最佳方法。

尝试使用Linq,
GroupBy

 IEnumerable<MyClass> source = ...;

 int group = 0;
 Guid key = new Guid(); 

 // Let's have an array of arrays (array of individual collections) as a result
 MyClass[][] buckets = source
   .GroupBy(item => {
      if (group == 0 || key != item.guid) {
        key = item.guid;
        group += 1; 
      } 

      return group; })
   .Select(chunk => chunk.ToArray()) 
   .ToArray(); 
IEnumerable源=。。。;
int组=0;
Guid键=新Guid();
//因此,让我们创建一个数组数组(单个集合数组)
MyClass[][]存储桶=源
.GroupBy(项目=>{
if(组==0 | |键!=item.guid){
key=item.guid;
组+=1;
} 
返回组;})
.Select(chunk=>chunk.ToArray())
.ToArray();

我是用linq做的,没有外部变量

    var list = new []{
        new {Id = "guid1", Path = @"c:\temp\doc1.docx", Index = 1},
        new {Id = "guid1", Path = @"c:\temp\doc2.docx", Index = 2},
        new {Id = "guid1", Path = @"c:\temp\doc3.docx", Index = 3},
        new {Id = "guid1", Path = @"c:\temp\doc4.docx", Index = 4},
        new {Id = "guid2", Path = @"c:\temp\doc5.docx", Index = 5},
        new {Id = "guid1", Path = @"c:\temp\doc6.docx", Index = 6},
        new {Id = "guid1", Path = @"c:\temp\doc7.docx", Index = 7}
    };


    var batchSize = 3;

    var batched = list.GroupBy(x => x.Id)
                    .Select(x => x.GroupBy(p => p.Index/batchSize)
                                    .ToArray());

    string json = JsonConvert.SerializeObject(batched);

    Console.WriteLine(json);
json序列化仅用于将输出打印到屏幕上,输出为:

[
   [
      [
         {
            "Id":"guid1",
            "Path":"c:\\temp\\doc1.docx",
            "Index":1
         },
         {
            "Id":"guid1",
            "Path":"c:\\temp\\doc2.docx",
            "Index":2
         }
      ],
      [
         {
            "Id":"guid1",
            "Path":"c:\\temp\\doc3.docx",
            "Index":3
         },
         {
            "Id":"guid1",
            "Path":"c:\\temp\\doc4.docx",
            "Index":4
         }
      ],
      [
         {
            "Id":"guid1",
            "Path":"c:\\temp\\doc6.docx",
            "Index":6
         },
         {
            "Id":"guid1",
            "Path":"c:\\temp\\doc7.docx",
            "Index":7
         }
      ]
   ],
   [
      [
         {
            "Id":"guid2",
            "Path":"c:\\temp\\doc5.docx",
            "Index":5
         }
      ]
   ]
] 

是什么决定了拆分发生的位置?请您定义一下,在您的示例中,第一个桶和第三个桶之间的差异在哪里?GUID相同。能否添加有关对象结构的详细信息?您共享的数据是CSV而不是对象。我将对象设置为CSV以使其更具可读性(或者我希望如此)。决定拆分的是guid何时更改。@KathyLori,以便旧guid可以再次出现?非常感谢您的尝试。这真是太好了。我需要好好学习我的linq技能。@Kathy Lori:不客气!Linq确实是一个强大的工具。当我看到答案时,它非常像英语,而且非常明确。我知道linq会是答案,但问题是如何表达答案。非常感谢。我的示例中的batchsize是3,但它是可变的。批大小是使用
var batchsize=3传入的我指的是物品的数量