2016-06-20 2 views
2

内のプロパティに関数を適用し、私はクラスを持っている:コピー一覧他に<SomeClass>が、LINQ

私がいることをコピーすることができますどのように
List<IdXYZ> Points = new List<IdXYZ>(); 
Points.Add(new IdXYZ(520, 150, 520)); 
Points.Add(new IdXYZ(567, 120, 522)); 
Points.Add(new IdXYZ(614, 520, 541)); 
Points.Add(new IdXYZ(661, 520, 540)); 
Points.Add(new IdXYZ(520, 110, 544)); 
Points.Add(new IdXYZ(543, 110, 545)); 
Points.Add(new IdXYZ(567, 610, 549)); 
Points.Add(new IdXYZ(614, 610, 510)); 
Points.Add(new IdXYZ(661, 160, 820)); 
Points.Add(new IdXYZ(520, 166, 530)); 
Points.Add(new IdXYZ(543, 166, 330)); 
Points.Add(new IdXYZ(567, 660, 520)); 
Points.Add(new IdXYZ(614, 660, 520)); 
Points.Add(new IdXYZ(661, 660, 620)); 

public class IdXYZ 
    { 
     int id; 
     double x; 
     double y; 
     double z; 
     public int ID 
     { 
      get { return id; } 
      set { id = value; } 
     } 
     public double X 
     { 
      get { return x; } 
      set { x = value; } 
     } 

     public double Y 
     { 
      get { return y; } 
      set { y = value; } 
     } 
     public double Z 
     { 
      get { return z; } 
      set { z = value; } 
     } 
     public IdXYZ(int argid, double argx, double argy, double argz) 
     { 
      id = argid; 
      x = argx; 
      y = argy; 
      z = argz; 
     } 
     public IdXYZ(double argx, double argy, double argz) 
     { 
      x = argx; 
      y = argy; 
      z = argz; 
     } 
    } 

は、私はすでにとしてリストを満たしたと仮定すると他しかし

以下の条件を適用する
if (item.Z % 2 == 0 || item.Z % 100 == 0) 
    item.Z = item.Z - 505; 
else 
    item.Z = item.Z - 405; 

へのリスト私は

をしていました
var PointsB = (from item in Points select item.Z % 2 == 0 || item.Z % 100 == 0 ? item.Z - 505 : item.Z - 405); 

しかし、それが唯一の条件の上に使用してZとの新し​​いリストを取得するにはどのようにZ

の列挙になるだろうか?

+0

item.Z%2 == 0 || item.Z%100 == 0 第2の条件はいつ真となりますが、最初の条件は真ではありませんか?私はあなたが第二の条件を全く必要としないと思います... –

答えて

1

別のオプションは次のとおりです。

List<IdXYZ> newList = Points 
     .Select(item => new IdXYZ 
     { 
      X = item.X, 
      Y = item.Y, 
      Z = item.Z % 2 == 0 || item.Z % 100 == 0 ? item.Z - 505 : item.Z - 405; 
     }) 
     .ToList(); 

クラスに匿名型のキャストについての詳細は、ここで見つけることができます:Convert Anonymous Type to Class

5

あなたはこのような何かをする必要があります:

var newList = 
    Points 
     .Select(item => 
     { 
      if (item.Z % 2 == 0 || item.Z % 100 == 0) 
       item.Z = item.Z - 505; 
      else 
       item.Z = item.Z - 405; 
      return item; 
     }) 
     .ToList(); 
2

があなたの元のリストの修正または変換されたバージョンを取得するために三項演算子とSelectステートメントを使用することができます。 C#は、今、あなたのコードの可読性を向上させることができますコレクション初期化子を使用して、あなたのリストを初期化することができます

var PointsB = Points.Select(x => { 
    x.Z = x.Z - ((x.Z % 100 == 0 || x.Z % 2 == 0) ? 505 : 405); 
    return x; 
}).ToList(); 

また、コードの改善のための提案のビットとして、あなたはこのようにあなたのリストを初期化して取り込むことができ:

List<IdXYZ> Points = new List<IdXYZ> 
{ 
    new IdXYZ(520, 150, 520), 
    new IdXYZ(567, 120, 522), 
    new IdXYZ(614, 520, 541), 
    new IdXYZ(661, 520, 540), 
    new IdXYZ(520, 110, 544), 
    new IdXYZ(543, 110, 545), 
    new IdXYZ(567, 610, 549), 
    new IdXYZ(614, 610, 510), 
    new IdXYZ(661, 160, 820), 
    new IdXYZ(520, 166, 530), 
    new IdXYZ(543, 166, 330), 
    new IdXYZ(567, 660, 520), 
    new IdXYZ(614, 660, 520), 
    new IdXYZ(661, 660, 620) 
}; 

アップデート1:また、あなたは以下のORを反転したいx.Z%2は短いそれをカットされますよう、x.Zの%として100がヒットすることはありません。

(x.Z % 2 == 0 || x.Z % 100 == 0)