将List <someclass>复制到其他但将函数应用于LINQ中的属性

时间:2016-06-20 05:06:28

标签: c# linq

我有一个班级:

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

假设我已经填写了一个列表:

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

如何将该列表复制到应用以下条件的其他BUT

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的新列表?

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

您可以使用带有三元运算符的Select语句来获取原始列表的修改或转换版本。

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

另外,作为代码改进的一点建议,C#现在允许您使用集合初始化程序初始化列表,这有助于提高代码的可读性,您可以初始化和填充列表,如下所示:

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,因为 xZ%100 将永远不会被命中,因为 xZ%2 将做空。

(x.Z % 2 == 0 || x.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