我有一个实现,我需要遍历一组文档并根据某些条件合并文档。
合并条件非常简单,如果当前文档的doctype与后续文档的doctype相同,则从后面的doctype中复制所有页面并将其附加到当前文档的页面中。 s并从集合中删除以后的文档。
注意:response.documents
和response.documents[].pages
都是列表<>集合。
我正在尝试此操作,但是在删除文档后出现了异常。
集合被修改枚举可能无法执行
以下是代码:
int docindex = 0;
foreach( var document in response.documents)
{
string presentDoctype = string.Empty;
string laterDoctype = string.Empty;
presentDoctype = response.documents[docindex].doctype;
laterDoctype = response.documents[docindex + 1].doctype;
if (laterDoctype == presentDoctype)
{
response.documents[docindex].pages.AddRange(response.documents[docindex + 1].pages);
response.documents.RemoveAt(docindex + 1);
}
docindex = docindex + 1;
}
前:
reponse.documents[0].doctype = "BankStatement" //page count = 1
reponse.documents[1].doctype = "BankStatement" //page count = 2
reponse.documents[2].doctype = "BankStatement" //page count = 2
reponse.documents[3].doctype = "BankStatement" //page count = 1
reponse.documents[4].doctype = "BankStatement" //page count = 4
预期结果:
response.documents[0].doctype = "BankStatement" //page count = 10
请建议。感谢您的帮助。
答案 0 :(得分:2)
我建议您查看LINQ GroupBy
和Distinct
来处理response.documents
示例(因为我不能使用您的类,我使用自己定义的类给出示例):
假设您有DummyClass
public class DummyClass {
public int DummyInt;
public string DummyString;
public double DummyDouble;
public DummyClass() {
}
public DummyClass(int dummyInt, string dummyString, double dummyDouble) {
DummyInt = dummyInt;
DummyString = dummyString;
DummyDouble = dummyDouble;
}
}
然后如图所示GroupBy
,
DummyClass dc1 = new DummyClass(1, "This dummy", 2.0);
DummyClass dc2 = new DummyClass(2, "That dummy", 2.0);
DummyClass dc3 = new DummyClass(1, "These dummies", 2.0);
DummyClass dc4 = new DummyClass(2, "Those dummies", 2.0);
DummyClass dc5 = new DummyClass(3, "The dummies", 2.0);
List<DummyClass> dummyList = new List<DummyClass>() { dc1, dc2, dc3, dc4, dc5 };
var groupedDummy = dummyList.GroupBy(x => x.DummyInt).ToList();
将创建三个组,标记为DummyInt
然后处理你可以做的小组
for (int i = 0; i < groupedDummy.Count; ++i){
foreach (DummyClass dummy in groupedDummy[i]) { //this will process the (i-1)-th group
//do something on this group
//groupedDummy[0] will consists of "this" and "these", [1] "that" and "those", while [2] "the"
//Try it out!
}
}
在您的情况下,您应该根据doctype
创建群组。
根据您的doctype
创建群组后,其他一切都会变得非常自然&#34;让你继续。
您可能感兴趣的另一种LINQ方法是Distinct
。但我想在这种情况下,GroupBy
将是您想要使用的主要方法。
答案 1 :(得分:0)
仅使用&#34; for循环&#34;而不是&#34; foreach&#34;。
foreach将保存集合,并且在循环时无法修改。
答案 2 :(得分:0)
以下是使用groupBy
的示例,希望此帮助。
//mock a collection
ICollection<string> collection1 = new List<string>();
for (int i = 0; i < 10; i++)
{
collection1.Add("BankStatement");
}
for (int i = 0; i < 5; i++)
{
collection1.Add("BankStatement2");
}
for (int i = 0; i < 4; i++)
{
collection1.Add("BankStatement3");
}
//merge and get count
var result = collection1.GroupBy(c => c).Select(c => new { name = c.First(), count = c.Count().ToString() }).ToList();
foreach (var item in result)
{
Console.WriteLine(item.name + ": " + item.count);
}
答案 3 :(得分:-3)
只需使用 AddRange()
即可response.documents[0].pages.AddRange(response.documents[1].pages);
它会将文档[1]的所有页面与文档[0]合并到文档[0]
中