Найти те же значения между 2 ArrayList и вернуть как другой ArrayList - PullRequest
0 голосов
/ 28 марта 2012

Я пытаюсь извлечь значения, разделенные двумя массивами, в другой массив.

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. Я выбрал неправильный метод, чтобы сделать это в первую очередь? Ваш совет приветствуется.

Спасибо всем за внимание =)

Ответы [ 4 ]

3 голосов
/ 28 марта 2012

Поскольку вы имеете дело с устаревшим кодом, вы можете просто использовать простой цикл 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 - усилия не должны быть слишком большими, и они сразу окупятся.

3 голосов
/ 28 марта 2012

Прежде всего, ArrayList - это устаревшая коллекция, которая использовалась до того, как Generics был представлен в .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}    

Если вы находитесь в унаследованном режиме, вам не будут доступны дженерики, и вам придется вручную перебирать списки для поиска пересечения.

2 голосов
/ 28 марта 2012
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);
1 голос
/ 28 марта 2012

Это время, когда использование ключевого слова var в качестве ярлыка для явного написания типа может привести к неприятностям.Если бы вы проверили возвращение расширения Intersect LINQ, вы бы увидели, что это возвращение IEnumerable<int>.Вы можете использовать некоторые из методов расширения 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;
}
...