首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用LINQ优化结果列表

使用LINQ优化结果列表
EN

Stack Overflow用户
提问于 2017-04-30 17:21:42
回答 2查看 214关注 0票数 0

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

代码语言:javascript
运行
复制
Brand               Start     End
----------------------------------------   
Nike                0         4      
Adidas              0         5      
Nike                4         10     
Levis               0         3     
Adidas              5         8     

我想要检查给定的起始数和结束号是否有任何范围数据,如果有任何特定范围的数据,我希望得到每个品牌的最大“结束”数。

例:假设我想检查一下在这种情况下是否有任何关于差距2到6的数据;

耐克的耐克有0-4和4-10的范围.所以它在我的2-6范围内(2在0-4和6在4-10之间),所以我希望我的结果是"NIKE 10“。

为阿迪达斯:阿迪达斯的范围为0-5和5-8.因此,它也在2-6范围内(2在0-5和6在5-8之间),我希望它是“阿迪达斯8”。

for LEVIS: LEVIS有一个范围0-3,2在该范围内.所以我想要"LEVIS 3“

我为此编写了一个Linq查询,我希望确保它正常工作。

代码语言:javascript
运行
复制
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)
              });

结果应包含;

代码语言:javascript
运行
复制
NIKE 10
ADIDAS 8
LEVIS 3

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-30 19:10:14

你快到了,花了我一分钟时间来理解你想要的是什么,但你所要做的就是把你范围内的每个数字当作一个独立的值。

这意味着数据库范围可以在其值之间包含2、6或两者。

您所需要做的就是将linq重写为如下所示:

代码语言:javascript
运行
复制
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)
              };

唯一的改变就是

代码语言:javascript
运行
复制
where (item.Start <= 2 && item.End >= 2) || (item.Start <= 6 && item.End >= 6)

所有这些都是检查是否有任何范围有2或任何范围内有6。

有关完整的示例,请参阅此要旨

编辑:

试一试,它应该始终显示品牌的最大范围,如果指定的值存在于该品牌内:

代码语言:javascript
运行
复制
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的gist

票数 1
EN

Stack Overflow用户

发布于 2017-04-30 19:00:19

试试这个:

代码语言:javascript
运行
复制
       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();
        }   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43709210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档