c# - 自定义类列表上的 Linq

标签 c# linq

我将如何编辑方法 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/

相关文章:

c# - 对资源使用 foreach 吗? (C#)

c# - 使 SortedList 只读

c# - 如何合并2本词典

c# - 如何 "clear"一个对象?

c# - HttpWebRequest PATCH 方法和 JSON 给出 Bad Request

linq - C# Linq "join"在 Rust 中的等价物是什么?

.net - 日期时间,日期时间?和 LINQ

c# - IEnumerable 选择

c# - 以编程方式从 Generic.xaml 中查找资源

performance - LINQ 使用带有 Count 和Where 的 Group,简单的 SQL,在 LINQ 中更难