0
votes

Dans une LINQ avec un SELECT, puis-je comparer à la ligne suivante et décider de quoi choisir?

Ce que j'ai mis en œuvre avec A pour une boucle est ceci:

            phraseSources2 = (List<Data1.Model.PhraseSource2>)phraseSources
            .Select(x => new PhraseSource2()
            {
                Kanji = x.Kanji,
                Kana = x.Kana,
                Furigana = x.Furigana,
                English = x.English,
            }).ToList();


6 commentaires

Avez-vous voulu dire var psnext = phrasalisation [i + 1]; ?


Si je comprends votre problème, je ne serais pas conforme à votre problème, je ne voudrais pas "regarder", mais utiliser groupby à la place et groupe par kanji et kana puis sélectionnez le plus long < Code> anglais comme nouveau phraséource2 objet.


Ce code semble mal à cause de PS et psnext étant défini sur la même chose initialement. En outre, il va causer une exception d'index hors de portée lorsque INCR considrez i dans ce si sans vérifier s'il est allé au-delà de la fin de la matrice / liste. Également phraséource2 est null donc il y a une exception de référence null aussi.


@Sanisinghhuttunen - Merci d'avoir souligné cette erreur de mienne.


@juhararr - Merci d'avoir souligné que ce serait un problème quand cela dépasse la taille de la liste.


Github.com/morelinq/morelinq#lag - LAG ou < Code> Diriger . Remarque - Ceci suppose que votre source est iEnumerable plutôt que iquéryable basé.


4 Réponses :


1
votes

Si la collection source est accessible par index, vous pouvez utiliser une surcharge sur la sélection qui vous donne l'index actuel.

var source = new[] { 'a', 'b', 'c' };
var result = source.Select((x, i) => new { Current = x, Next = source.Length > i+1 ? source[i+1] : ' '});


1 commentaires

Oui, la collection source est accessible par un index mais dans le cas de cette question, comment puis-je faire le comparateur de plusieurs propriétés comme je le fais. Cela pourrait-il aussi être fait?



1
votes

Tout ce que vous avez à faire est simplement de configurer une variable à l'intérieur d'une requête où vous pouvez facilement récupérer la valeur suivante ou précédente comme celle-ci: xxx

Si vous souhaitez vérifier certaines conditions avant, vous voulez peut le faire comme ceci: xxx


7 commentaires

Merci mais comment pourrais-je mettre en œuvre cela pour vérifier quelque chose de plus compliqué comme je fais que je fais où je vérifie si deux choses sont identiques, puis si la longueur de la propriété anglaise est plus petite. Puis-je simplement trier la liste par Kanji, Kana et Anglais (longueur), puis choisissez le dernier élément avec une sorte de commande par?


J'ai ajouté une deuxième approche en utilisant des index dans ma réponse. Pourriez-vous être quelque chose dont vous avez besoin?


Merci, je vérifie que maintenant. Qu'en est-il du chèque que je mettez dans l'endroit où je vérifie la longueur de la propriété anglaise et utilisez simplement l'élément de la liste avec le plus long?


Ceci est le chèque que je fais: ps.english.length <= psnext.Anglais.Longueur de longueur


Vous pouvez simplement vérifier sur où avant de sélectionner.


Bonjour, je pense qu'il est proche d'être ce dont j'ai besoin, mais je reçois des erreurs ici: Kanji NextEnglish = (liste ) Phrasesources.skip (Y + 1) .firstordfault (). Anglais; x.glish.length


Remplacer le premier kanji avec var, ma mauvaise



1
votes

Si je comprends votre problème Correcly, je ne "regarder pas", mais utilisez plutôt groupy code> et groupe par kanji code> et kana code> alors Sélectionnez CODE> Le plus long anglais code> comme valeur dans le phraséource2 code> objet.

quelque chose comme ceci: p>

var phraseSource2 = phraseSources
    .GroupBy(x => new {Kanji = x.Kanji, Kana = x.Kana})
    .Select(g => new PhraseSource2 {
        Kanji = g.Key.Kanji,
        Kana = g.Key.Kana,
        Furigana = g.First().Furigana,
        English = g.OrderByDescending(x => x.English.Length).First().English
    });


0 commentaires

0
votes

Il n'y a pas de méthode intégrée, mais il existe des bibliothèques tierces qui offrent cette fonctionnalité. Morelinq est une bibliothèque gratuite et gratuite qui offre un windowleft code> méthode d'extension, qui traite une séquence dans une série des sous-séquences représentant un sous-ensemble fenêtré de l'original. Pour que vous puissiez l'utiliser pour traiter vos phrases de phrases à deux et jeter les paires qui ont deux phrases égales. Enfin, sélectionnez la première phrase des paires survivant.

using static MoreLinq.Extensions.WindowLeftExtension;

var phraseSources2 = phraseSources
.WindowLeft(size: 2)
.Where(phrases => // phrases is of type IList<PhraseSource2>
{
    if (phrases.Count == 2) // All have size 2 except from the last
    {
        var ps = phrases[0];
        var psNext = phrases[1];
        return ps.Kanji != psNext.Kanji || ps.Kana != psNext.Kana ||
            ps.English.Length > psNext.English.Length;
    }
    else // The last is a single phrase
    {
        return true;
    }
})
.Select(window => window[0]) // Select the first phrase
.ToList();


0 commentaires