假设我们有一个由06/07/2017
08/06/2017
和Line
定义的Point startPoint
类。
如果我有这些行的列表,如何使用 LINQ 将其中的所有点提取到一个Point endPoint
。
这是我到目前为止所做的:
List<Point>
答案 0 :(得分:4)
如果你想要更短的方式,你可以这样做:
var points = lines.SelectMany(l => new[] { l.StartPoint, l.EndPoint }).ToList();
但是,您当前的代码更具可读性,但更重要的是,不会为您迭代的每个line
创建一个数组。
但是,您不需要为每个集调用ToList()
,您只需写下:
var points = lines.Select(l => l.StartPoint).Concat(lines.Select(l => l.EndPoint)).ToList();
答案 1 :(得分:1)
您可以通过几种不同的方式完成此操作。一种是使用algo.pdf
:
Tuple<Point, Point>
要访问这些内容,您必须记住IEnumerable<Tuple<Point, Point>> r = lines.Select(l => new Tuple<Point, Point>(l.StartPoint, l.EndPoint));
为StartPoint
而Item1
为EndPoint
:
Item2
另一个可能是制作一个包含2个元素的数组:
foreach ( Tuple<Point, Point> se in r )
{
var start = se.Item1;
var end = se.Item2;
}
要访问这些内容,您必须记住,索引IEnumerable<Point[]> r = lines.Select(l => new Point[2]{ l.StartPoint, l.EndPoint });
包含您的0
,而索引StartPoint
包含您的1
:
EndPoint
您始终可以创建仅包含这两个属性的平面模型,然后在foreach( Point[] parr in r )
{
if( parr.Length == 2 )
{
var start = parr[0];
var end = parr[1];
}
}
中投射/创建它。
有很多方法可以达到你想要的效果。真正的问题是你想在以后对这个结果做些什么。
答案 2 :(得分:1)
您的解决方案就越接近它。如果你不想列举两次列表,你应该采用Foreach / Map方法:
RewriteEngine on
RewriteCond %{THE_REQUEST} /index.php\?p=70\s [NC]
RewriteRule ^ http://example.com/newpage.php? [L,R]
如果您不想使用Concat,可以使用Union:
var points = new List<Point>();
lines.Map(line =>
{
points.Add(line.startPoint);
points.Add(line.EndPoint);
} );