【问题标题】:Use linq between condition to get value from List在条件之间使用 linq 从 List 中获取值
【发布时间】:2021-04-19 10:35:59
【问题描述】:

我有一个包含 2 条记录的列表。我需要根据 Linq C# 中的条件获取价值。目前,以下条件是同时获得 2 个名称而不是 1 个。

列出数据

var groups = new List<Entry>{
            new Entry{
                Name = "Group1",
                StartFrom = 73200,
                End = 73400
            },
            new Entry {
                Name = "Group2",
                StartFrom = 73007,
                End = 73509
            }
        };

代码 1

int value = 73201

string name = Groups.SingleOrDefault(x => (x.StartFrom <= value && x.End>= value )).Name;

Console.WriteLine(name);
//Output should be Group1


【问题讨论】:

  • 感谢您抽出宝贵时间分享您的问题。它质量低下,不知何故不清楚。你的目标和困难是什么?到目前为止你做了什么?请尝试更好地解释您的问题、开发环境、数据类型和预期结果,并分享更多或更少的代码(无屏幕截图)、用户故事或场景图。为了帮助您改进您的要求,请阅读How do I ask a good questionWriting the perfect questionidownvotedbecau.se/unclearquestion
  • not working 是什么意思?
  • @ChetanRanpariya,我的意思是得到两个名字而不是 1。
  • 无法重现,过滤器对我来说很好:dotnetfiddle.net/Tzrl0d
  • @Sajid 好的理解。问题出在数据上。我会向 DB 团队提出这个问题。

标签: c# .net list linq arraylist


【解决方案1】:

当返回多个结果时,SingleOrDefault 会抛出异常。

Enumerable.SingleOrDefault Method

返回序列的唯一元素,如果序列为空,则返回默认值;如果序列中有多个元素,此方法将引发异常。

你可以尝试使用FirstOrDefault,如果有多个结果,它不会介意,它会返回结果中的前1个

【讨论】:

  • 我们能确定 FirstOrDefault 的值是正确的吗?
  • 它将与您的 where 表达式一样正确。通常,您会添加 OrderBy 或 OrderByDescending 来获取第一条记录或最后一条记录。
【解决方案2】:

我认为这可能有效。 这只有在 StartFrom 和 End 之间没有交集时才有效!

string name = groups.Where(x => (x.StartFrom <= value && x.End >= value)).FirstOrDefault().Name;

更正,因为我没有看到第 1 组的范围在第 2 组的范围内。

string name = groups.Where(x => (x.StartFrom <= value && x.End >= value)).OrderByDescending(x => x.StartFrom).FirstOrDefault().Name;

【讨论】:

  • 如果数据不按顺序这个是不行的。 dotnetfiddle.net/GjuzVB
  • 你说得对,我忽略了第 1 组在第 2 组的范围内,谢谢指出。
  • 没问题。问题在于数据。
猜你喜欢
  • 2012-03-27
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2013-02-17
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
相关资源
最近更新 更多