我正在从我的存储过程中获取数据
Brand Start End
----------------------------------------
Nike 0 4
Adidas 0 5
Nike 4 10
Levis 0 3
Adidas 5 8
我想检查是否有给定开始和结束数字的任何范围数据,如果有任何给定范围的数据,我想获得每个品牌的最大“结束”数字
ex:假设我想检查是否有差距2到6的数据 在这种情况下;
NIKE: NIKE的范围是0-4和4-10。因此它在我的2-6范围内(2在0-4和6之间是在4-10之间)所以我希望我的结果为“NIKE 10”
ADIDAS的: ADIDAS的范围是0-5和5-8。所以它也在2-6范围内(2介于0-5和6之间介于5-8之间)我希望它为“ADIDAS 8”
LEVIS的: LEVIS有一个范围0-3和2在该范围之间。所以我想把它当作“LEVIS 3”
我为此写了一个Linq查询,我想确保它正常工作。
var result = (from items in responce.List
where items.Start>= 2 && items.End <= 6
group items by items.Brand into g
select new
{
Max = g.Max(x=> x.End)
});
结果应包含;
NIKE 10
ADIDAS 8
LEVIS 3
提前致谢
答案 0 :(得分:1)
你几乎就在那里,花了我一分钟来了解你所追求的是什么,但你需要做的只是将你范围内的每个数字视为独立的价值。
这意味着数据库范围可以在其值之间具有2,6或两者。
你需要做的就是将linq改写成这样的东西:
var result = from item in list
where (item.Start <= 2 && item.End >= 2) || (item.Start <= 6 && item.End >= 6)
group item by item.Brand into g
select new
{
Brand = g.Key,
Max = g.Max(x => x.End)
};
唯一的变化是
where (item.Start <= 2 && item.End >= 2) || (item.Start <= 6 && item.End >= 6)
所有这些都是检查是否有任何范围 2 或其中任何范围 6 。
有关完整示例,请参阅此gist。
<强> 编辑: 强>
尝试这个,如果指定的值存在于该品牌内,它应始终显示品牌的最大范围:
var result = (
from item in list
group item by item.Brand into g
from subItem in g
where (subItem.Start <= 2 && subItem.End >= 2) || (subItem.Start <= 6 && subItem.End >= 6)
select new
{
Brand = g.Key,
Max = g.Max(x => x.End)
}
).Distinct();
答案 1 :(得分:0)
试试这个:
static void Main(string[] args)
{
List<Sneaker> sneakers = new List<Sneaker>() {
new Sneaker() { brand = "Nike", start = 0, end = 4},
new Sneaker() { brand = "Adidas", start = 0, end = 5},
new Sneaker() { brand = "Nike", start = 4, end = 10},
new Sneaker() { brand = "Levis", start = 0, end = 3},
new Sneaker() { brand = "Adidas", start = 5, end = 8}
};
int start = 2;
int end = 6;
var groups = sneakers.GroupBy(x => x.brand).Select(x => x.OrderBy(y => y.end)).Select(x => x.Any(y => y.end > end) ? x.FirstOrDefault(): x.LastOrDefault())
.Where(x => x != null).Select(x => new {brand = x.brand, end = x.end}).ToList();
}