[英]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.