0
votes

Renvoyer les résultats exacts de LINQ contient

J'ai un tableau contenant un exemple de colonne XYZ. Ci-dessous dans les exemples de données.

Sales,
Sales_units,
ATL

Je dois écrire une requête Linq pour transmettre certaines valeurs d'entrée et obtenir les résultats, donc j'utilise le code ci-dessous pour le même.

string check="Sales_units,ATL";
var res = objlist.where(x=> check.Contains(x.XYZ)).ToList();

Ceci renvoie les valeurs suivantes:

XYZ
-------
Sales,
Sales_units,
Sales_Units_Per,
ATL

Mais mon résultat devrait être comme: Sales_units, ATL p >

Quelqu'un peut-il m'aider à résoudre le problème.

Merci d'avance.


3 commentaires

Salut mani654, Ce serait génial si vous créez un exemple reproductible minimal avec l'entrée et quelle sera la valeur attendue. Nous ne savons pas quelles sont les valeurs présentes dans objlist , quelle valeur stocke dans la propriété XYZ


Salut Merci pour la rediffusion, la colonne XYZ a 4 valeurs comme Sales, Sales_units, Sales_Units_Per et ATL. Si j'utilise Contains avec Sales_units, ATL, il renvoie Sales, Sales_units, ATL. Donc, je veux Le résultat Seulement Sales_units, ATL.


Objlist est une liste de chaînes. string [] objlist = ["Sales", "Sales_Units", "Sales_Units_per", "ATL"]. J'espère que cela t'aidera


3 Réponses :


0
votes

essayez ceci -> var check = new string [] {"Sales_units", "ATL"};


1 commentaires

Bien que ce code puisse résoudre le problème du PO, il est préférable d'inclure une explication sur la façon dont votre code résout le problème du PO. De cette façon, les futurs visiteurs peuvent apprendre de votre publication et l'appliquer à leur propre code. SO n'est pas un service de codage, mais une ressource de connaissances. De plus, les réponses complètes et de haute qualité sont plus susceptibles d'être votées. Ces fonctionnalités, ainsi que l'exigence que tous les messages soient autonomes, sont quelques-unes des forces de SO en tant que plate-forme, qui le différencie des forums. Vous pouvez modifier pour ajouter des informations supplémentaires et / ou pour compléter vos explications avec la documentation source.



0
votes

Votre problème ici est que le mot "Sales_units" contient en fait "Sales" . Il semble que vos données permettent de diviser la chaîne d'abord le long des marques , , puis de voir si les sous-chaînes sont égales plutôt que si elles contiennent quelque chose.

Une alternative pourrait être une expression régulière pour trouver start ou virgule suivie du mot suivi de la fin ou de la virgule avec un espace entre les deux.

J'ai pris la liberté d'écrire une version fractionnée. Je vais laisser la version regex à vous.

class Program
{

    class Ws {
        public string XYZ;
        public Ws(string xyz) { XYZ = xyz; } }

    static void ConsoleWrite(string name, IEnumerable<Ws> list) {
        Console.WriteLine(name);
        foreach (var item in list)
            Console.WriteLine($"  '{item.XYZ}'"); }

    static IEnumerable<Ws> Original(IEnumerable<Ws> objlist) {
        string check = "Sales_units,ATL";
        var res = objlist.Where(x => check.Contains(x.XYZ)).ToList();
        return res; }

    static IEnumerable<Ws> StringSplitVersion(IEnumerable<Ws> objlist) {
        string[] checks = "Sales_units,ATL".Split(',');
        return objlist.Where(x => checks.Any(c => c.Equals(x.XYZ))); }

    static void Main(string[] args) {
        var objlist = new List<Ws> { new Ws("Sales"), new Ws("Sales_units"), new Ws("Sales_Units_Per"), new Ws("ATL") };
        ConsoleWrite("original", Original(objlist));
        ConsoleWrite("stringsplit", StringSplitVersion(objlist)); }
}


0 commentaires

0
votes

Essayez l'instruction de jointure dans LINQ. Consultez la documentation pour plus d'informations .

    static void Main()
    {
        string check = "Sales_units,ATL";
        var checkList = check.Split(",");

        var objlist = new List<Columns>();

        var result = objlist.Join(checkList, c => c.XYZ, s => s, (c, s) => c);

    }

    class Columns
    {
        public string XYZ { get; set; }
    }


0 commentaires