我将如何编辑方法 ClosestColor
接受参数 List<DuluxColours>
而不是 List<Color>
?
我需要方法ClosestColor
从我的 List<DuluxColours>
返回颜色名称
这可能吗?我的 Linq 熟练度有点欠缺:)
感谢您的帮助!
public int ClosestColor(List<Color> colours, Color target)
{
var colorDiffs = colours.Select(n => ColorDiff(n, target)).Min(n => n);
return colours.FindIndex(n => ColorDiff(n, target) == colorDiffs);
}
public int ColorDiff(Color c1, Color c2)
{
return (int)Math.Sqrt((c1.R - c2.R) * (c1.R - c2.R)
+ (c1.G - c2.G) * (c1.G - c2.G)
+ (c1.B - c2.B) * (c1.B - c2.B));
}
public class DuluxColour
{
public string ColourName { get; set; }
public Color Colour { get; set; }
}
最佳答案
试试这个:
public DuluxColour ClosestColor(List<DuluxColour> colours, Color target)
{
var colorDiffs = colours.Select(n => ColorDiff(n.Colour, target)).Min(n => n);
return colours.Find(n => ColorDiff(n.Colour, target) == colorDiffs);
}
请注意,我选择返回 DuluxColour
而不是仅返回名称,因此调用者可以选择获取颜色值。在您的情况下,您需要调用:
string closestColorName = ClosestColor(colours, target).ColourName;
请注意,您可以处理 ClosestColor
返回 null 的可能性。
不使用明确的 List
,您还可以使用:
public DuluxColour ClosestColor(IEnumerable<DuluxColour> colours, Color target)
{
var colorDiffs = colours.Select(n => ColorDiff(n.Colour, target)).Min(n => n);
return colours.FirstOrDefault(n => ColorDiff(n.Colour, target) == colorDiffs);
}
关于c# - 自定义类列表上的 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42016730/