【问题标题】:How to fetch unique objects using Linq如何使用 Linq 获取唯一对象
【发布时间】:2021-03-09 11:20:27
【问题描述】:

嗨,有人可以帮忙吗,我有一个包含我的促销代码的列表,在列表中我想只返回出现一次的促销代码,即没有重复,请参阅下面来自 JSON 的数据,我想返回促销代码 A123 和 B500 并将它们存储在另一个列表中。

[
   {
    "PromCode": "A123",
    "Priority": 1,
    "offer": "Win a Free Cap",
    "StartDte": "2020-08-11T00:16:23.184Z",
    "endDte": "2020-09-10T17:16:23.184Z",
  }, 
  {
    "PromCode": "A100",
    "Priority": 1,
    "offer": "Win a perfume",
    "StartDte": "2020-08-11T00:16:23.184Z",
    "endDte": "2020-09-10T17:16:23.184Z",
  },
{
    "PromCode": "A100",
    "Priority": 2,
    "offer": "Win a Phone pouch",
    "StartDte": "2020-09-11T00:16:23.184Z",
    "endDte": "2020-10-10T17:16:23.184Z",
  },
 {
    "PromCode": "B500",
    "Priority": 1,
    "offer": "Win a free router",
    "StartDte": "2020-08-11T00:16:23.184Z",
    "endDte": "2020-09-10T17:16:23.184Z",
  },
 {
    "PromCode": "H300",
    "Priority": 2,
    "offer": "Win a free router",
    "StartDte": "2020-08-11T00:16:23.184Z",
    "endDte": "2020-09-10T17:16:23.184Z",
  },

]

我有一个包含所有这些促销代码的列表,如下所示,注意:我已经序列化了 JSON 对象成功

var existingProms = await _Repo.GetAllPromCodes(promCodeList);

我试图得到像这样在列表中出现一次的那些

  var distinctList = existingProms.GroupBy(x => x.PromCode).Where(y => y.Count() == 1)
                   .Select(x => x.Key.ToString()).ToList();

请注意,上面返回不同的 proms(B500,A123,H300) 但仅返回 PromCode 而不是该对象中的所有其他字段。我想返回我的所有对象的列表优先级=1。意味着不同的List最终结果必须包含两个对象,如下图所示。

distinctList = {
    "PromCode": "A123",
    "Priority": 1,
    "offer": "Win a Free Cap",
    "StartDte": "2020-08-11T00:16:23.184Z",
    "endDte": "2020-09-10T17:16:23.184Z",
  }, 
 {
    "PromCode": "B500",
    "Priority": 1,
    "offer": "Win a free coffee mug",
    "StartDte": "2020-08-11T00:16:23.184Z",
    "endDte": "2020-09-10T17:16:23.184Z",
  },

【问题讨论】:

  • 您正在寻找 unique 而不是不同的对象。 Distinct 表示即使有重复也只返回一行。 LINQ 有一个 Distinct() 方法,但这不是你真正想要的

标签: c# asp.net json linq asp.net-core


【解决方案1】:

在您的 groupby 中,您需要选择分组的第一个元素,而不是选择 Key

var distinctList = existingProms
    .GroupBy(x => x.PromCode)
    .Where(y => y.Count() == 1)
    .Select(x => x.First()) // Changed from .Select(x => x.Key.ToString())
    .ToList();

【讨论】:

    【解决方案2】:

    只需对原始查询进行额外修改即可到达:

            var distinctList = existingProms
                .GroupBy(x => x.PromCode)
                .Where(y => y.Count() == 1 && y.First().Priority == 1)
                .Select(x => x.First())
                .ToList();
    

    由于y.Count() == 1 确保您只获得组中的一个项目,您可以使用First 获取它并在.Where(y => y.Count() == 1 && y.First().Priority == 1) 中通过它过滤Priority,然后在下一个方法调用中选择该对象。

    上面是方法语法的例子,在查询语法中是:

        var distinctList = (from ep in existingProms
                            group ep by ep.PromCode into g
                            where g.Count() == 1 && g.First().Priority == 1
                            select g.First())
                            .ToList();
    

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多