使用linq将双精度数组转换为列表对象

本文关键字:列表 对象 转换 数组 linq 双精度 使用 | 更新日期: 2023-09-27 18:11:42

我有以下坐标数组:

double[] points = { 1, 2, 3, 4, 5, 6 };

然后我有以下类:

public class clsPoint
{
    public double X { get; set; }
    public double Y { get; set; }
}

我需要复制点到List对象。数组中的第一个点是X,第二个点是y。这是我目前得到的,但它是不正确的:

List<clsPoint> lstPoints = points
                           .Select(coord => new clsPoint
                           {
                               X = coord[0],
                               Y = coord[1]
                           }).ToList();

预期结果

clsPoint Objects List (lstPoints)
X = 1 , Y = 2
X = 3 , Y = 4
X = 5 , Y = 6

任何帮助都会很感激。谢谢。

使用linq将双精度数组转换为列表对象

您可以生成一个连续值序列,直到您的数组的一半,然后您可以使用这些值作为索引来获得对。

var result=Enumerable.Range(0, points.Length / 2).Select(i=>new clsPoint{X=points[2*i],Y=points[2*i+1]});

更新

这是另一种使用Zip扩展方法和Where扩展方法的重载来获得索引的解决方案:

var r2 = points.Where((e, i) => i % 2 == 0)
               .Zip(points.Where((e, i) => i % 2 != 0), (a, b) => new clsPoint{X= a, Y= b });

我认为可能有一种更好的方法让你在上课之前把你的观点写好。在这种情况下,一个简单的for循环可能就足够了。

然而,在LINQ中,您将首先使用一个投影来收集索引,以便您可以基于对进行分组,然后使用来自分组的第二个投影来填充类。

看起来是这样的

points.Select((v,i) => new { 
    val = v, 
    i = i 
}).GroupBy(o => o.i%2 != 0 ? o.i-1 : o.i).Select(g => new clsPoint() {
    X = g.First().val,
    Y = g.Last().val
});

使用接收当前索引的Select的过载,您可以设置分组规则(在这种情况下,为每2个数字设置不同的id),然后按它分组并最终创建新的clsPoint:

double[] points = { 1, 2, 3, 4, 5, 6 };
var result = points.Select((item, index) => new { item, index = index / 2 })
                   .GroupBy(item => item.index, item => item.item)
                   .Select(group => new clsPoint { X = group.First(), Y = group.Last() })
                   .ToList();

用一个简单的for循环来做,看起来像:

List<clsPoint> result = new List<clsPoint>();
for (int i = 0; i < points.Length; i += 2)
{
    result.Add(new clsPoint { X = points[i], Y = points.ElementAtOrDefault(i+1) });
}