【问题标题】:Filter List<Point> as per given Condition using LINQ使用 LINQ 根据给定条件过滤 List<Point>
【发布时间】:2011-06-22 06:40:06
【问题描述】:

一个包含通用列表说=>List&lt;Point&gt;

现在我需要根据以下条件过滤 points 并将其存储在另一个 List&lt;Point&gt; 中并使用 LINQ

• 在给定的 YPoint

• 查找具有最大 X 值和 最小 X 值的点。

注意:

其实朋友们,如果可能的话,我正在寻找仅在单个查询中执行上述操作的 LINQ 查询。

否则使用 LINQ 进行上述操作的任何最佳解决方案,

编辑:- 在这里查看我的代码,但我正在寻找排序解决方案.....

               int givenY = 147;

                List<Point> listOfPointLocal = (from point in listOfPointMain
                        where point.Y == givenY
                        select point).ToList();

                var minX = listOfPointLocal.Min(p => p.X);
                var maxX = listOfPointLocal.Max(p => p.X);

                List<Point> listOfFilterdPoint = (from p in listOfPointLocal
                                         where p.X <= minX || p.X >= maxX
                                         select p).ToList();

谢谢……..

【问题讨论】:

  • 到目前为止你有什么代码?可以发一下吗?
  • @Caspar,实际上我还有很长的路要走..首先找到具有给定 y 的点,然后对其进行查询并找到具有 MinimumX 值和 MaximumX 值的点,实际上我正在寻找在单个 LINQ 查询中执行上述操作的方式.....谢谢....
  • 但是您对此有何看法?看起来您正在寻找一个现成的解决方案,甚至没有自己的头脑。
  • @Aryan SuryaWansi SO 不是机械土耳其人。社区渴望在 OP 愿意展示其改进的地方帮助有特定问题的人。不要坐等,请用适当的代码重新表述您的问题。

标签: c# linq


【解决方案1】:

在额外课程的帮助下,您只能通过列表一次。

public class MaxMin
{
    public int max { get; set; }
    public int min { get; set; }
}

然后

var points = new List<Point>() 
                {
                    new Point(10, 10), 
                    new Point(15, 10), 
                    new Point(20, 10), 
                    new Point(42, 42), 
                    new Point(47, 11) 
                };

var maxmin = new MaxMin() { max = int.MinValue, min = int.MaxValue};
maxmin = points.Where(p => p.Y == 10).
                    Aggregate(maxmin, (acc, next) =>
                    {
                        if (next.X > acc.max) acc.max = next.X;
                        if (next.X < acc.min) acc.min = next.X;
                        return acc;
                    });

【讨论】:

    【解决方案2】:

    为了让它有点可读性:

     var points = new List<Point>()
                        {
                            new Point(10, 10), 
                            new Point(15, 10), 
                            new Point(20, 10), 
                            new Point(42, 42), 
                            new Point(47, 11) 
                        };
    
    var maxes = new {
        minX  = (from p in points orderby p.X select p).First(),  // with lowest x
        maxX  = (from p in points orderby p.X select p).Last(), // with highest x
        minY  = (from p in points orderby p.Y select p).First(), //  with lowest y
        maxY  = (from p in points orderby p.Y select p).Last() // with highest y
    };
    

    【讨论】:

    • 那么您将丢失有关该点在另一个列表中的排名的所有信息。
    【解决方案3】:

    虽然它不会在单个查询中为您提供最小和最大 X,但以下代码可能对您有用。

            List<Point> list = new List<Point>();
            list.Add(new Point(10, 10));
            list.Add(new Point(15, 10));
            list.Add(new Point(20, 10));
            list.Add(new Point(25, 15));
            list.Add(new Point(30, 15));
    
            var minX = (from p in list
                        where (p.Y.Equals(10))
                        select p.X).Min();
    
            var maxX = (from p in list
                        where (p.Y.Equals(10))
                        select p.X).Max();
            Console.WriteLine(minX.ToString());
            Console.WriteLine(maxX.ToString());
            Console.ReadLine();
    

    【讨论】:

      【解决方案4】:

      这将返回一个结果集,但它仍在迭代列表两次,尽管 AFAIK 没有这样做,但你无法做到。

      list.Select(a => new 
       { 
       Max = list.Where(max => max.Y == ???).Max(max => max.X), 
       Min = list.Where(min => min.Y == ???).Min(min => min.X)
       });
      

      【讨论】:

        猜你喜欢
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        • 1970-01-01
        • 2019-09-20
        相关资源
        最近更新 更多