-2
votes

Comment récupérer des enregistrements sans doublons à l'aide de Linq

Bonjour, quelqu'un peut-il m'aider s'il vous plaît, j'ai une liste qui contient mes codes de promotion et dans la liste je voudrais retourner uniquement les codes de promotion qui apparaissent une fois, c'est-à-dire qui n'ont pas de doublons, veuillez voir ci-dessous les données de JSON, je voudrais renvoyer le code de promotion A123 et B500 et enregistrez-les dans une autre liste.

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

J'ai une liste qui contient tout ce code de promotion comme indiqué ci-dessous

var existingProms = await _Repo.GetAllPromCodes(promCodeList);

j'ai essayé d'en obtenir ceux qui apparaissent une fois dans la liste comme ceci

[
   {
    "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",
  },

]

Mais cela n'a pas fonctionné, il y a 0 résultats retournés, quelqu'un pourrait-il montrer comment obtenir mes deux Proms A123, B500 dans ma liste d'apparition.Merci


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser GroupBy pour obtenir tous les résultats regroupés par PromoCode. Ensuite, filtrez les résultats en fonction du nombre d'éléments que chaque groupe doit afficher uniquement lorsque Count() == 1 .

Quelque chose comme ça peut-être,

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 commentaires

@Jawas Merci d'avoir travaillé, juste besoin d'ajouter var singlesOnly = obj.GroupBy (x => x.PromCode) .Where (y => y.Count () == 1). Sélectionnez (x => x.Key.ToString ()). ToList (); pour qu'il renvoie le singlessOnly sous forme de liste de chaînes



0
votes

Vous ne devez comparer les objets souhaités que par promcode implicitement. Regardez comment fonctionne Equals et 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);
            }
        }
    }
}


0 commentaires

0
votes

Définissez d'abord les éléments de classe

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

Ensuite, prenez plusieurs éléments dans la liste et utilisez la fonction distinct () pour supprimer les valeurs en double-

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


0 commentaires