使用LINQ优化结果列表

时间:2017-04-30 17:21:43

标签: c# linq

我正在从我的存储过程中获取数据

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

提前致谢

2 个答案:

答案 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();

这是另一个gist with the updated linq

答案 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();
        }