Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq按范围分组_C#_Linq_Group By_Range - Fatal编程技术网

C# 使用linq按范围分组

C# 使用linq按范围分组,c#,linq,group-by,range,C#,Linq,Group By,Range,我们如何将分组范围用于等于或大于 var data = new[] { new { Id = 0, Price = 2 }, new { Id = 1, Price = 10 }, new { Id = 2, Price = 30 }, new { Id = 3, Price = 50 }, new { Id = 4, Price = 120 }, new { Id = 5, Price = 200 }, new { Id = 6, Pri

我们如何将分组范围用于等于或大于

var data = new[] {
    new { Id = 0, Price = 2 },
    new { Id = 1, Price = 10 },
    new { Id = 2, Price = 30 },
    new { Id = 3, Price = 50 },
    new { Id = 4, Price = 120 },
    new { Id = 5, Price = 200 },
    new { Id = 6, Price = 1024 },
};

var ranges = new[] { 10, 50, 100, 500 };
var grouped = data.GroupBy( x => ranges.FirstOrDefault( r => r > x.Price ) );

grouped ouput is 
price 10-50 -> 3 
price 50-100 -> 1 
price 100-500 -> 2 
所需输出按等于或大于所用范围分组

price >= 10 -> 6
price >= 50 -> 4
price >= 100 -> 3
price >= 500 -> 1
还有另一个选项(如果您有大量数据,那么分组比枚举每个价格组的所有数据要好):


分组分区在源中,每个项目都分配给一个组

您拥有的是一个良好的开端:

var data = new[] {
    new { Id = 0, Price = 2 },
    new { Id = 1, Price = 10 },
    new { Id = 2, Price = 30 },
    new { Id = 3, Price = 50 },
    new { Id = 4, Price = 120 },
    new { Id = 5, Price = 200 },
    new { Id = 6, Price = 1024 },
};

var ranges = new[] { 10, 50, 100, 500 };
var grouped = data.GroupBy( x => ranges.FirstOrDefault( r => r <= x.Price ) );
var数据=新[]{
新的{Id=0,Price=2},
新的{Id=1,Price=10},
新的{Id=2,Price=30},
新的{Id=3,Price=50},
新的{Id=4,Price=120},
新的{Id=5,Price=200},
新的{Id=6,Price=1024},
};
var范围=新[]{10,50,100,500};
var grouped=data.GroupBy(x=>ranges.FirstOrDefault(r=>rg.Key,g=>g.Count());
foreach(counts.Keys.OrderByDescending中的int键(i=>i))
{
soFar+=计数[键];
计数[键]=soFar;
}

或者,如果您想在一条linq语句中执行此操作:

int soFar = 0;
var grouped = data
  .GroupBy( x => ranges.FirstOrDefault( r => r <= x.Price ) )
  .OrderByDescending(g => g.Key)
  .Select(g =>
  {
    soFar += g.Count();
    return new Tuple<int, int>(g.Key, soFar)
  });
int-soFar=0;
变量=数据
.GroupBy(x=>ranges.FirstOrDefault(r=>rg.Key)
.选择(g=>
{
soFar+=g.计数();
返回新元组(g.Key,soFar)
});

100->2
应该是
100->3
,因为您似乎使用了价格等于或大于所用范围的物品计数。(顺便说一下,您应该尝试澄清您的问题,因为您没有提到某种计数)@Francis P谢谢..我编辑了我的帖子..我需要精确计算价格等于或大于所用范围的物品的数量。谢谢它解决了我的问题@lazyberezovsky@cosmicgate我在你的问题中没有看到任何类别。那是什么?@cosmicgate抱歉,但新的要求使当前的答案无效。我认为最好为你的问题创建新的问题Rthat@cosmicgate另外,我可以给您一个从何处开始的提示—我认为您需要组合键来分组
data.GroupBy(x=>new{x.cat,price=ranges.FirstOrDefault(r=>r>x.price)})
。再次抱歉-现在没有更多的空闲时间来调查您的需求。如果您遇到困难,请提出新问题-有人会帮助您:)
var data = new[] {
    new { Id = 0, Price = 2 },
    new { Id = 1, Price = 10 },
    new { Id = 2, Price = 30 },
    new { Id = 3, Price = 50 },
    new { Id = 4, Price = 120 },
    new { Id = 5, Price = 200 },
    new { Id = 6, Price = 1024 },
};

var ranges = new[] { 10, 50, 100, 500 };
var grouped = data.GroupBy( x => ranges.FirstOrDefault( r => r <= x.Price ) );
int soFar = 0;
Dictionary<int, int> counts = grouped.ToDictionary(g => g.Key, g => g.Count());
foreach(int key in counts.Keys.OrderByDescending(i => i))
{
  soFar += counts[key];
  counts[key] = soFar;
}
int soFar = 0;
var grouped = data
  .GroupBy( x => ranges.FirstOrDefault( r => r <= x.Price ) )
  .OrderByDescending(g => g.Key)
  .Select(g =>
  {
    soFar += g.Count();
    return new Tuple<int, int>(g.Key, soFar)
  });