簡體   English   中英

C#比較2個不同大小的整數列表

[英]C # Compare 2 lists of ints of different size

我目前有2個要比較的列表,這些列表永遠不會相等。

List<int> data ,長度為n

List<int> numbersToSeekFor ,其長度為n,並且包含data中所有不同值的集合

List<Color> colorsToAssign其長度是一樣的numbersToSeekFor

我要實現的(不是很成功)是將data所有項目與numbersToSeekFor每個索引進行比較。 如果滿足此條件, colorsToAssign的第一個index添加到列表中,然后將第二個索引添加到列表中,依此類推...

下面的一個非常愚蠢的例子就是這種方法。 我假設在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;
  }

實現這一目標的最干凈的方法是什么?

謝謝您的幫助

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

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

在你的循環中

您可以使用字典將值映射到顏色上,而不必傳遞所有不同值的單獨列表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM