C#比较2个不同大小的整数列表

时间:2018-11-25 09:04:57

标签: c# list comparison

我目前有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 :(得分:3)

那么,您可以使用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;
}

答案 1 :(得分:1)

如果我正确理解,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]]);

在您的循环中

答案 2 :(得分:0)

您可以使用字典将值映射到颜色上,而无需传递所有不同值的单独列表:

    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;
    }

此代码假定不同值的计数为<= 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]];