C # Сравнение 2 списков целых разного размера - PullRequest
0 голосов
/ 25 ноября 2018

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

List<int> data, которая имеет длину n

List<int> numbersToSeekFor, которая имеет длину n и содержит множество всех различных значений в data

List<Color> colorsToAssign, чьядлина равна numbersToSeekFor

То, чего я хочу достичь, но не очень успешно, это сравнить все элементы в data с каждым индексом numbersToSeekFor.Если это условие истинно, первый index из colorsToAssign будет добавлен в список, а затем второй индекс и т. Д. *

Очень глупым примером следующего будет этот метод.Если бы я предполагал, что в numbersToSeekFor есть 3 элемента.Выходной список этого метода также должен иметь размер, равный data.

public List<Color> Foo(List<int> data, List<int>numbersToSeekFor, List<Color> colorsToAssign)
  {
    List<Color> colors = new List<Color>();
    for (int i = 0; i < data.Count; i++)
    {



        if(data[i] == numbersToSeekFor[0])
        {
          colors.Add(colorsToAssign[0]);

        }

        if(data[i] == numbersToSeekFor[1] )
        {
          colors.Add(colorsToAssign[1]);


        }

        if(data[i] == numbersToSeekFor[2])
        {
          colors.Add(colorsToAssign[2]);


        }


    }

    return colors;
  }

Какой самый чистый способ добиться этого?

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

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

var mapNumberToIndex = new Dictionary<int, int>();
for (var i = 0; i < numbersToSeekFor.Count; i++)
    mapNumberToIndex.Add(numbersToSeekFor[i], i);

Тогда вы можете просто использовать

colors.Add(mapNumberToIndex[data[i]]);

в цикле

0 голосов
/ 25 ноября 2018

Вы можете использовать словарь для отображения значений на цвета и избавиться от необходимости передавать в отдельный список всех различных значений:

    public static List<Color> AssignColours(List<int> data, List<Color> coloursToAssign)
    {
        var result = new List<Color>();
        var map    = new Dictionary<int, Color>();
        int n      = 0;

        foreach (var datum in data)
        {
            if (!map.TryGetValue(datum, out var colour))
            {
                // Next line will throw exception if number of distinct numbers
                // is greater than length of coloursToAssign.

                colour = coloursToAssign[n++];
                map[datum] = colour;
            }

            result.Add(colour);
        }

        return result;
    }

Этот код предполагает, что количество различных значенийравен <= длина <code>coloursToAssign, в противном случае в строке с комментариями будет исключение.

В качестве альтернативы (и более эффективно, если вы вызываете это несколько раз), вы можете предварительно рассчитать карту следующим образом:

public static Dictionary<int, Color> MapColours(List<int> numbersToSeekFor, List<Color> coloursToAssign)
{
    var map = new Dictionary<int, Color>();

    for (int i = 0; i < numbersToSeekFor.Count; ++i)
        map[numbersToSeekFor[i]] = coloursToAssign[i];

    return map;
}

, а затем используйте его так:

var map = MapColours(numbersToSeekFor, coloursToAssign);

...

var colourToUse = map[data[someIndex]];
0 голосов
/ 25 ноября 2018

Ну, вы можете использовать сочетание методов LINQ .Where и .Select:

public static List<Color> Foo3(List<int> data, List<int> numbersToSeekFor, List<Color> colorsToAssign)
{
    if (data?.Any() != true || numbersToSeekFor?.Any() != true || colorsToAssign?.Count != data.Count)
    {
        return new List<Color>();
    }

    List<Color> colors = data
                         .Select(d => numbersToSeekFor.IndexOf(d))
                         .Where(i => i > -1 && i < colorsToAssign.Count)
                         .Select(i => colorsToAssign[i])
                         .ToList();
    return colors;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...