2017-02-03 1 views
2

ClosestColorを編集して、List<Color>の代わりにList<DuluxColours>というパラメータを受け入れる方法を教えてください。私は私のList<DuluxColours>カスタムクラスリストのLinq

から色の名前を返すようにする方法ClosestColorが必要

はこのさえ可能ですか?私の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; } 
} 
+0

のために働くことを願って私はあなたがする必要があると思います: var colorDiffs = colours.Select(n => ColorDiff(n.Colour、target))。Min(n => n.Colour); return colours.FindIndex(n => ColorDiff(n.Colour、target)== colorDiffs); – publicgk

答えて

4

これを試してみてください:発信者が色の値を取得するオプションを持っているので、私が選んだ

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を返すように。あなたのケースでは、呼び出す必要があります:あなたはnullを返すClosestColorの可能性を扱う必要があり

string closestColorName = ClosestColor(colours, target).ColourName; 

注意し。明示的な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); 
} 
+2

良い答え。また、OPがコードを簡素化できることにも注意してください。現在、色を2回繰り返します(1つは最小値、2つ目は最小の色を見つける)。これは、 'return colours.Select(n => new {Color = n、Diff = ColorDiff(n.Colour、target)})のように単純化することができます。 – Rob

+0

@Rob良い点。 –

+0

あなたの貢献のおかげで@ロブ:) –

-1

あなたはこれを試してみてください可能性があり、

public int ClosestColor(List<DuluxColour> colours, Color target) 
    { 

     var colorDiffs = colours.Select(n => ColorDiff(n.Colour, target)).Min(n => n); 
     return colours.FindIndex(n => ColorDiff(n.Colour, target) == colorDiffs); 
    } 

私はこれがあなた

+0

理由はdownvoteのために、それは私のために役立つだろう.. –

-1
 public class Program 
     { 
      public static void Main(string[] args) 
      { 
       //Your code goes here 
       Console.WriteLine("Hello, world!"); 
       List<DuluxColour> _colors= new List<DuluxColour>(); 
       _colors.Add(new DuluxColour{Colour = Color.Black , ColourName ="Black"}); 
        _colors.Add(new DuluxColour{Colour = Color.Red , ColourName ="Red"}); 
        _colors.Add(new DuluxColour{Colour = Color.Green , ColourName ="Green"}); 
        _colors.Add(new DuluxColour{Colour = Color.Yellow , ColourName ="Yellow"}); 
       var col =ClosestColor(_colors, Color.Purple); 
       Console.Write(col.ColourName); 
      } 
      public static 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); 
      } 

      public static 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; } 
     } 
-1
you can still do,  

    public static void Main(string[] args) 
     { 
      //Your code goes here 
      Console.WriteLine("Hello, world!"); 
      List<DuluxColour> _colors= new List<DuluxColour>(); 
      _colors.Add(new DuluxColour{Colour = Color.Black , ColourName ="Black"}); 
       _colors.Add(new DuluxColour{Colour = Color.Red , ColourName ="Red"}); 
       _colors.Add(new DuluxColour{Colour = Color.Green , ColourName ="Green"}); 
       _colors.Add(new DuluxColour{Colour = Color.Yellow , ColourName ="Yellow"}); 
      var col =ClosestColor(_colors, Color.Purple); 
      Console.Write(col); 
     } 
     public static string ClosestColor(List<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).ColourName; 
     } 

     public static 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)