【问题标题】:Find Same Values Between 2 ArrayList And Return As Another ArrayList在 2 个 ArrayList 之间找到相同的值并作为另一个 ArrayList 返回
【发布时间】:2012-04-11 14:42:11
【问题描述】:

我正在尝试将两个数组列表共享的值提取到另一个数组列表中。

using System.Linq;

private ArrayList GetSameOf2AL(ArrayList first, ArrayList second)
        {
            ArrayList same = new ArrayList();

            var one = from int i in first select i;
            var two = from int i in second select i;

            var SameVal = one.Intersect(two);
            //I am supposed to convert or cast SameVal into arraylist here
            return same;
        }

我的问题是:

  1. 我无法将 var 类型转换回 arraylist,谁能告诉我怎么做?
  2. 我是否一开始就选择了错误的方法来执行此操作?感谢您的建议。

感谢大家的关注=)

【问题讨论】:

  • 你为什么首先使用ArrayList?没有这个原因,使用List<T>
  • @BrokenGlass 我正在处理遗留代码...
  • 如果您能够使用 LINQ,我很难相信这是遗留代码... :)
  • 不...参数是从遗留代码传递的(arraylist first & second)..我正在创建新方法来处理参数..并返回可以处理回来的东西那些遗留代码..

标签: c# linq arraylist ienumerable


【解决方案1】:

由于您处理的是遗留代码,您可以使用简单的foreach 循环:

private ArrayList GetSameOf2AL(ArrayList first, ArrayList second)
{
    ArrayList same = new ArrayList();

    var one = from int i in first select i;
    var two = from int i in second select i;

    var sameVal = one.Intersect(two);
    //I am supposed to convert or cast SameVal into arraylist here
    foreach (int i in sameVal)
        same.Add(i);
    return same;
}

虽然这确实是拼凑而成,但最好将代码重构为使用 List<int> 而不是 ArrayList - 努力不应该太多,它会立即得到回报。

【讨论】:

  • 为什么不直接使用ToListAddRange(或者根本不使用ToList)?
  • @M.Babcock 这将是另一种选择——尽管它在引擎盖下是相同的,并且您正在创建一个“丢弃”集合(我猜这并不重要)
【解决方案2】:

首先,ArrayList 是在泛型引入 .NET 之前使用的过时集合。除非您正在构建遗留代码,否则不应使用它。相反,您应该将注意力转向 List 类。

IEnumerable<int> first = new []{1,2,3};
IEnumerable<int> second = new [] {2,3,4};

List<int> intersection = first.Intersect(second).ToList(); // result {2,3}    

如果您处于旧模式,那么您将无法使用泛型,您将不得不手动迭代列表以找到交集。

【讨论】:

    【解决方案3】:
    List<int> intersection = first.Cast<int>().Intersect(second.Cast<int>()).ToList();
    

    ArrayList intersection = new ArrayList();
    foreach (var i in first.Cast<int>().Intersect(second.Cast<int>()))
        intersection.Add(i);
    

    【讨论】:

      【解决方案4】:

      此时使用var 关键字作为显式写出类型的快捷方式可能会给您带来麻烦。如果您检查了Intersect LINQ 扩展的返回值,您会看到返回值是IEnumerable&lt;int&gt;。您可以使用一些IEnumerable 扩展方法将IEnumerable 表示的数据传输到ArrayList

      private ArrayList GetSameOf2AL(ArrayList first, ArrayList second)
      {
          ArrayList same = new ArrayList();
      
          var one = from int i in first select i;
          var two = from int i in second select i;
      
          same.AddRange(one.Intersect(two).ToArray<int>());
          return same;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-04-28
        • 2013-12-30
        • 2011-07-25
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 2021-01-03
        相关资源
        最近更新 更多