2016-06-20 8 views
2

Ich habe eine Klasse:Kopieren Sie eine Liste <SomeClass> in anderen aber eine Funktion auf eine Eigenschaft in LINQ Anwendung

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; 
     } 
    } 

Gesetzt Ich füllte bereits eine Liste wie:

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)); 

Wie kann ich kopieren, dass Liste in anderen BUT Anwendung folgende Bedingung

if (item.Z % 2 == 0 || item.Z % 100 == 0) 
    item.Z = item.Z - 505; 
else 
    item.Z = item.Z - 405; 

ich tat

var PointsB = (from item in Points select item.Z % 2 == 0 || item.Z % 100 == 0 ? item.Z - 505 : item.Z - 405); 

Aber das würde nur zählbare von Z erhalten

Wie die neue Liste bekommen mit Z obigen Bedingung verwendet?

+0

item.Z% 2 == 0 || item.Z% 100 == 0 Wann wird die zweite Bedingung wahr, aber nicht die erste? Ich glaube nicht, dass du die zweite Bedingung brauchst ... –

Antwort

1

Eine weitere Option ist:

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(); 

Mehr über anonymen Typen Klasse Gießen, finden Sie hier: Convert Anonymous Type to Class

5

Sie müssen, so etwas tun:

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

Sie eine Select-Anweisung mit einem ternären Operator eine modifizierte oder transformierte Version Ihrer ursprünglichen Liste bekommen nutzen könnten.

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

Auch als ein bisschen ein Vorschlag für die Code-Verbesserung, jetzt C# können Sie Ihre Liste mit einem Auflistungsinitialisierer initialisieren, die die Lesbarkeit des Codes verbessern hilft, könnten Sie initialisieren und Ihre Liste wie folgt füllen :

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) 
}; 

Hoffe, das hilft!

Update 1: Außerdem möchten Sie die folgende OR, wie x.Z% 100 wird nie so x.Z% 2 wird es kurz geschnitten getroffen werden, invertieren.

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