Как извлекать записи без дубликатов с помощью Linq

#c# #json #linq #.net-core

#c# #json #linq #.net-core

Вопрос:

Привет, может кто-нибудь помочь, пожалуйста, у меня есть список, содержащий мои промо-коды, и в списке я хотел бы возвращать только промо-коды, которые появляются один раз, т.Е. У меня нет дубликатов, см. Ниже Данные из 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",
  },

]
  

У меня есть список, содержащий весь этот промокод, как показано ниже

 var existingProms = await _Repo.GetAllPromCodes(promCodeList);
  

я попытался получить те, которые появляются один раз в списке следующим образом

 var appearOnce = existingProms.Count(x => existingBnplIndicators.Contains(x.PromCode)).ToList()<2;
var appearOnce = existingProms.where(x=> x.PromCode.Count()).ToList()<2;
  

Но это не сработало, было возвращено 0 результатов, может кто-нибудь показать, как получить мои два Proms A123, B500 в моем appearOnce lis.Спасибо

Ответ №1:

Вы можете использовать GroupBy , чтобы получить все результаты, сгруппированные по промокоду. Затем отфильтруйте результаты на основе количества элементов, которые каждая группа должна показывать только тогда, когда Count() == 1 .

Возможно, что-то вроде этого,

 public class Class1
{
    public string PromCode { get; set; }
    public int Priority { get; set; }
    public string offer { get; set; }
    public DateTime StartDte { get; set; }
    public DateTime endDte { get; set; }
}

var obj = JsonConvert.DeserializeObject<List<Class1>>(json);
var singlesOnly = obj.GroupBy(x => x.PromCode).Where(y => y.Count() == 1);
  

Комментарии:

1. @Jawas Спасибо, что сработало, просто нужно было добавить var singlesOnly = obj . GroupBy(x => x.PromCode). Где(y => y.Count() == 1) . Выберите(x=>x.Key.toString()) . ToList(); для того, чтобы он возвращал singlessOnly в виде списка строк

Ответ №2:

Вы должны сравнивать нужные объекты только с помощью promcode неявно. Посмотрите, как работают Equals и GetHashCode().

 using System;
using System.Collections.Generic;
using System.Linq;

namespace test
{
    public class TestObj : IEquatable<TestObj>
    {
        public string Promocode { get; set; }
        public int Priority { get; set; }
        public string offer { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime endDate { get; set; }
        public override int GetHashCode() => this.Promocode.GetHashCode();
        public bool Equals(TestObj other) => Promocode.Equals(other.Promocode);
    }
    class Program
    {
        static void Main(string[] args)
        {
            var a = new TestObj()
            {
                Promocode = "1",
                Priority = 1,
                offer = "1",
                StartDate = new DateTime(1, 2, 3),
                endDate = new DateTime(1, 2, 3)
            };

            var b = new TestObj()
            {
                Promocode = "1",
                Priority = 1,
                offer = "1",
                StartDate = new DateTime(1, 2, 3),
                endDate = new DateTime(1, 2, 3)
            };
            var c = new TestObj()
            {
                Promocode = "2",
                Priority = 1,
                offer = "1",
                StartDate = new DateTime(1, 2, 3),
                endDate = new DateTime(1, 2, 3)
            };

            var list = new List<TestObj>()
            {
                a,
                b,
                c
            };

            var uniqueOnly = list.Distinct();

            foreach (var item in uniqueOnly)
            {
                Console.WriteLine(item.Promocode);
            }
        }
    }
}
  

Ответ №3:

Сначала определите элементы класса-

         public string PromCode { get; set; }
        public int Priority { get; set; }
        public string offer { get; set; }
        public DateTime StartDte { get; set; }
        public DateTime endDte { get; set; }
  

Затем возьмите несколько элементов в списке и используйте функцию distinct () для удаления повторяющихся значений-

 static void Main(string[] args)
    {
        List<TestClass> list = new List<TestClass>()
        {
            new TestClass(){PromCode="A123",Priority=1,offer="Win a Free 
            Cap",StartDte=new DateTime(2020-08-11),endDte=new DateTime(2020-09-10)},

            new TestClass(){PromCode="A100",Priority=1,offer="Win a 
            perfume",StartDte=new DateTime(2020-08-11),endDte=new DateTime(2020-09- 
            10)},

            new TestClass(){PromCode="A100",Priority=2,offer="Win a Phone 
            pouch",StartDte=new DateTime(2020-09-11),endDte=new DateTime(2020-10-10)},

            new TestClass(){PromCode="B500",Priority=1,offer="Win a free 
            router",StartDte=new DateTime(2020-08-11),endDte=new DateTime(2020-09-10)}
        };

        var finalList = list.Select(b => b.PromCode).Distinct().ToList();
        foreach(var item in finalList)
        {
            Console.WriteLine(item   "");
        }
        Console.Read();
        }
    }