使用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
任何帮助都会很感激。谢谢。
您可以生成一个连续值序列,直到您的数组的一半,然后您可以使用这些值作为索引来获得对。
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) });
}