【问题标题】:Taking distinct item from list of datapoints从数据点列表中获取不同的项目
【发布时间】:2010-10-21 04:54:16
【问题描述】:

我有一个数据点列表(列表)。

e.g

original list
(1,2)
(2,2)
(1,3)
(3,3)
(4,3)
(2,3)
(5,4)

I want a output list as

(1,2)
(2,2)
(3,3)
(4,3)
(5,4)
or

(1,3)
(3,3)
(4,3)
(2,3)
(5,4)

即我想删除 X 值重复的所有其他点。

我的一种方法是遍历所有点并获取当前点 x 值,如果它等于其他点 X 值,则将其与列表的其余部分进行比较,然后删除该值。

我将如何使用 LINQ 或一些扩展方法(不同)来做到这一点

【问题讨论】:

  • 您能展示一下您现在如何将它们存储在您的列表中吗?即,它是 List 还是 List> ?
  • DataPoint 是 System.Windows.Forms.DataVisualization.Charting 中的类。所以它的 List

标签: c# linq generics


【解决方案1】:

使用 LINQ 的一种方法是按 X 坐标对点进行分组,然后从 每个 组中选择一些任意项来生成输出。

var filtered = myList.GroupBy(point => point.XValue) // point's bucket depends on its X
                     .Select(group => group.First()) //pick first item from each bucket
                     .ToList();

编辑:不使用 LINQ 的简单方法:

var pointsByXCoord = new Dictionary<double, DataPoint>();

foreach(var point in myList)
   pointsByXCoord[point.XValue] = point;

var filtered = pointsByXCoord.Values;

【讨论】:

  • 虽然这对我有用,但它会比嵌套的 foreach 更昂贵吗??
  • @Mohit:原则上,这种方法应该比你原来的建议快得多。不过,找出答案的唯一方法是测量。
【解决方案2】:

只要数据点实现了IEquatable&lt;&gt; 接口,var enumerable = myList.Distinct() 就会返回一个IEnumerable&lt;Datapoint&gt;

这是一篇关于自定义类型要求的好文章,以便能够使用来自 LINQ 的 Distinct() 扩展:

Link

如果您需要列表而不是 IEnumerable,还提供了 ToList() 扩展名。

【讨论】:

    【解决方案3】:

    我认为这是更好的解决方案:

    var filtered =
    myList.GroupBy(point =>
    point.XValue.ToString() + "," point.YValue[0].ToString()).Select(group => group.First
    ()).ToList();
    

    因为只有 xvalue 数据点不是唯一的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2020-07-23
      相关资源
      最近更新 更多