如何合并列表中的项目<>集合C#

时间:2015-12-29 08:44:50

标签: c# list for-loop collections foreach

我有一个实现,我需要遍历一组文档并根据某些条件合并文档。

合并条件非常简单,如果当前文档的doctype与后续文档的doctype相同,则从后面的doctype中复制所有页面并将其附加到当前文档的页面中。 s并从集合中删除以后的文档。 注意:response.documentsresponse.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

请建议。感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

我建议您查看LINQ GroupByDistinct来处理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]