使用Linq选择多个属性

时间:2017-02-24 09:26:11

标签: c# linq

假设我们有一个由06/07/2017 08/06/2017 Line定义的Point startPoint类。

如果我有这些行的列表,如何使用 LINQ 将其中的所有点提取到一个Point endPoint

这是我到目前为止所做的:

List<Point>

3 个答案:

答案 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)); StartPointItem1EndPoint

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