【问题标题】:Merge Two ArrayList in C#在 C# 中合并两个 ArrayList
【发布时间】:2012-07-05 09:05:06
【问题描述】:

我想在 c# 中合并两个数组列表中的所有数据。 arraylist 中的一些数据与另一个 arraylist 相同。合并时我不想重复数据。

ArrayList1   ArrayList2
    1             1
    2             2
    3             4
                  5

我尝试了下面的编码。但结果不如我预期:

for(int i = 0; i<arrayList2;i++)
{
  for(int j = 0; j<arrayList1;j++)
  {
     if(arraylist1[i] == arraylist2[j])
     {
        newArraylist.add(arraylist[i]+"-same");
     }
     else
     {
        newArraylist.add(arraylist[i]+"-from arrayList2");
     }
  }
}

上面代码的结果是:

newArrayList
   1 - same
   2 - same
   4 - from arraylist2
   5 - from arraylist2

我想要的结果:

 newArrayList
       1 - same
       2 - same
       3 - from arraylist1
       4 - from arraylist2
       5 - from arraylist2

【问题讨论】:

  • 鉴于您使用的是 C# 2,您有什么理由不使用 List&lt;T&gt;
  • Erm,如果你的代码 sn-p 中没有 from arraylist1 的输出,你怎么能指望它呢?
  • @JonSkeet 我正在使用 ArrayList,因为老开发人员将这个软件留给了我 ArrayList.. 哦,为什么。-_-"
  • @Shevek 因为我不知道如何...请帮忙。
  • 获取泛型,放弃arraylist。

标签: c# merge arraylist .net-2.0


【解决方案1】:

最简单最简单的方法是使用 LINQ

var collection1 = new ArrayList() { 1, 2, 3 };
var collection2 = new ArrayList() { 1, 2, 4, 5 };
var mergedList = new ArrayList();
mergedList.AddRange(collection1);
mergedList.AddRange(collection2.ToArray().Where(item => !collection1.ToArray().Contains(item)).ToList());
Console.WriteLine(String.Join(", ", mergedList.ToArray()));
Console.ReadLine();

【讨论】:

  • collection1 不需要转换为数组来检查 Contains(item)。
【解决方案2】:

这个怎么样:

var arrayList1 = new ArrayList {1, 2, 3};
var arrayList2 = new ArrayList {1, 2, 4, 5};
var newList = new ArrayList();

foreach (var item in arrayList1)
{
    if(arrayList2.Contains(item))
    {
        newList.Add(string.Format("{0} - same", item));
        arrayList2.Remove(item);
    }
    else
    {
        newList.Add(string.Format("{0} - from arrayList1", item));
    }
}

foreach(var item in arrayList2)
{
    newList.Add(string.Format("{0} - from arrayList2", item));
}

这会给你这个结果:

1 - same
2 - same
3 - from arraylist1
4 - from arraylist2
5 - from arraylist2

【讨论】:

    【解决方案3】:

    遍历项目并查看它是否包含在第一个数组中。

    foreach (int item in arrayList2)
    {
        if (!arrayList1.Contains(item))
            arrayList1.Add(item);
    }
    

    【讨论】:

      【解决方案4】:

      您正在根据索引进行比较,这是行不通的。 ArrayList1[2] 包含 3,而 ArrayList1[2] 包含 4

      您必须使用.Contains() 来检查该号码是否存在于另一个列表中。

      【讨论】:

        【解决方案5】:

        代码

        var collection1 = new ArrayList() { 1, 2, 3 };
        var collection2 = new ArrayList() { 1, 2, 4, 5 };
        
        var merge = collection1.ToArray().Union(collection2.ToArray()).Distinct();
        var result = new List<String>();
        foreach (var val in merge)
        {
            var newString = string.Empty;
            if (collection1.Contains(val) && collection2.Contains(val))
                newString = val.ToString() + " - same";
            else if (collection1.Contains(val))
                newString = val.ToString() + " - from list 1";
            else
                 newString = val.ToString() + " - from list 2";
            Console.WriteLine(newString);
            result.Add(newString);
        }
        

        产生输出

        1 - same
        2 - same
        3 - from list 1
        4 - from list 2
        5 - from list 2
        

        【讨论】:

        • 联合是 3.5 的功能。在 2.0 中不可用
        • 我的错。好吧,自己的 Union() 方法可以很容易地编写:)
        【解决方案6】:

        最干净的选择是使用 Union (LINQ)。 要了解它是如何工作的,请查看:http://www.dotnetperls.com/union

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-11
          • 2017-08-28
          • 1970-01-01
          • 2019-09-17
          • 2014-09-10
          • 1970-01-01
          • 2015-01-20
          相关资源
          最近更新 更多