C# 计数多个不同的值-Linq

C# 计数多个不同的值-Linq,c#,performance,linq,C#,Performance,Linq,我有一个点列表(每个点都有id、x、y、z属性) 我想获得属性x,y,z 我正在做: var points = new List<MyPoint> { new MyPoint {Id = 0, X = 97.5, Y = 92.5, Z = -16.6666660308838}, new MyPoint {Id = 1, X = 292.5, Y = 92.5, Z = -16.6666660308838}, new MyPoint {Id = 2, X =

我有一个点列表(每个点都有
id、x、y、z
属性)

我想获得属性
x,y,z

我正在做:

var points = new List<MyPoint>
{
    new MyPoint {Id = 0, X = 97.5, Y = 92.5, Z = -16.6666660308838},
    new MyPoint {Id = 1, X = 292.5, Y = 92.5, Z = -16.6666660308838},
    new MyPoint {Id = 2, X = 97.5, Y = 277.5, Z = -16.6666660308838},
    new MyPoint {Id = 3, X = 292.5, Y = 277.5, Z = -16.6666660308838},
    new MyPoint {Id = 4, X = 97.5, Y = 462.5, Z = -16.6666660308838},
    new MyPoint {Id = 5, X = 292.5, Y = 462.5, Z = -16.6666660308838},
    new MyPoint {Id = 6, X = 97.5, Y = 92.5, Z = -49.9999980926514},
    new MyPoint {Id = 7, X = 292.5, Y = 92.5, Z = -49.9999980926514},
    new MyPoint {Id = 8, X = 97.5, Y = 277.5, Z = -49.9999980926514},
    new MyPoint {Id = 9, X = 292.5, Y = 277.5, Z = -49.9999980926514},
    new MyPoint {Id = 10, X = 97.5, Y = 462.5, Z = -49.9999980926514},
    new MyPoint {Id = 11, X = 292.5, Y = 462.5, Z = -49.9999980926514},
    new MyPoint {Id = 12, X = 97.5, Y = 92.5, Z = -83.3333320617676},
    new MyPoint {Id = 13, X = 292.5, Y = 92.5, Z = -83.3333320617676},
    new MyPoint {Id = 14, X = 97.5, Y = 277.5, Z = -83.3333320617676},
    new MyPoint {Id = 15, X = 292.5, Y = 277.5, Z = -83.3333320617676},
    new MyPoint {Id = 16, X = 97.5, Y = 462.5, Z = -83.3333320617676},
    new MyPoint {Id = 17, X = 292.5, Y = 462.5, Z = -83.3333320617676}
};
var result =
    points
    .GroupBy(l => l.Id)
    .Select(g => new
    {
        sizeX = g.Select(l => l.X).Distinct().Count(),
        sizeY = g.Select(l => l.Y).Distinct().Count(),
        sizeZ = g.Select(l => l.Z).Distinct().Count()
    });

是否遵循您的需求

var result = new
{
    sizeX = points.Select(l => l.X).Distinct().Count(),
    sizeY = points.Select(l => l.Y).Distinct().Count(),
    sizeZ = points.Select(l => l.Z).Distinct().Count()
};
您可以执行以下任一操作:

    HashSet<double> xes = new HashSet<double>();
    HashSet<double> yes = new HashSet<double>();
    HashSet<double> zes = new HashSet<double>();

    foreach (MyPoint pt in list)
    {
      xes.Add(pt.X);
      yes.Add(pt.Y);
      zes.Add(pt.Z);
    }


你认为
GroupBy(l=>l.Id)
有什么作用呢?我需要按其他属性分组,但当我需要计算disctinct X,Y,Z时,怎么做?或者正如我所理解的那样,按所有三个属性分组?您可以通过匿名对象进行分组
GroupBy(l=>new{l.sizeX,l.sizeY,l.sizeZ})
@cMinor不确定您是否听说过“过早优化是万恶之源”,但我建议您尝试一下,自己测量一下速度。LINQ解决方案通常比非LINQ解决方案慢几倍,但在大多数情况下它们仍然足够快。我建议您删除“编辑”一词中的所有内容。我知道您是在开玩笑,但还是很快用谷歌搜索了它=d
    HashSet<double> xes = new HashSet<double>();
    HashSet<double> yes = new HashSet<double>();
    HashSet<double> zes = new HashSet<double>();

    foreach (MyPoint pt in list)
    {
      xes.Add(pt.X);
      yes.Add(pt.Y);
      zes.Add(pt.Z);
    }
int countX = xes.Count; etc...
    HashSet<double> xes = new HashSet<double>();
    HashSet<double> yes = new HashSet<double>();
    HashSet<double> zes = new HashSet<double>();

    list.Aggregate((xes, yes, zes), (acc, pt) =>
    {
      acc.xes.Add(pt.X);
      acc.yes.Add(pt.Y);
      acc.zes.Add(pt.Z);
      return acc;
    });
int countX = xes.Count; etc...