C# 如何将一个集合划分为不同的“集合”;“桶”;
我有一个C#对象的集合。对于数据成员,每个对象都有一个guid字符串、一个int索引和一个文档名字符串。以下是一个典型集合的外观: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
"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传入的代码>我指的是物品的数量