我目前有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;
}
实现这一目标的最干净的方法是什么?
谢谢您的帮助
答案 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]];