使用LINQ优化结果列表



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

Brand               Start     End
----------------------------------------   
Nike                0         4      
Adidas              0         5      
Nike                4         10     
Levis               0         3     
Adidas              5         8     

我想检查给定的启动和终点数字是否有任何范围数据,以及是否有任何具有给定范围的数据,我想获得每个品牌的最大"结束"

ex:假设我想检查差距2至6是否有任何数据在这种情况下;

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,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

有关一个完整的示例,请参见此要点。

编辑:

尝试这个,如果该品牌中指定的值存在:

,它应该始终显示该品牌的最大范围:
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();

这是更新的linq。

的另一个要点

尝试以下:

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

最新更新