7
votes

Comment obtenir une combinaison de déplacement de deux listes en C #?

J'ai deux Liste code> qui contient xxx pré>

maintenant, j'ai besoin d'obtenir les combinaisons de déplacement à une chaîne de liste p>

Donc, la liste de sortie contiendra p> xxx pré>

maintenant, j'utilise imbriqué pour boucle code> pour cela.? Y a-t-il un moyen de faire cela en utilisant linq code> ou lambda expression code> S'il vous plaît aidez-moi à faire cela. Merci d'avance p>

code fort> p> xxx pré>

mais il ne donne pas la sortie correcte p> xxx

mais la sortie requise est comme p> xxx pré>

code d'échantillon en utilisant pour boucle code> strong> p> p> p> P> P>

List<String> ResultTwo = new List<string>();
        for (int i = 0; i < ListOne.Count; i++)
        {
            for (int j = 0; j < ListTwo.Count; j++)
            {
                if(ListOne[i] != ListTwo[j])
                    if (ResultTwo.Contains(ListOne[i] + "-" + ListTwo[j]) == false && ResultTwo.Contains(ListTwo[j] + "-" + ListOne[i]) == false) 
                ResultTwo.Add(ListOne[i] + "-" + ListTwo[j]);
            }
        }


3 commentaires

Voulez-vous associer les éléments des deux listes de sorte que chaque élément de la liste d'une liste est uniquement jumelé avec des éléments de la liste deux qui arrivent après la survenue de l'élément de la liste? Peut-être que vous pourriez poster votre code actuel, si ce n'est pas trop gros.


@RMX: édité dans .............


Vous devriez expliquer que voulez-vous vraiment. Ce n'est pas vraiment clair de votre question. Laquelle des paires voulez-vous entrer dans la sortie et que vous ne voulez pas? Le choix est-il effectué sur les valeurs ou sur les positions dans les listes? Par exemple, quelle devrait être la sortie de liste1 = D, C, B, A; list2 = a, b, c, d? Quelle devrait être la sortie de liste1 = a, b, c; list2 = B, B, D, B?


5 Réponses :


8
votes

Après vos modifications, cela devrait faire le truc: xxx pré>

la deuxième version qui conserve la commande (articleFromList1 - itemFromList2): P>

        var result =
            from o in
                (
                    from a in ListOne
                    from b in ListTwo
                    let condition = a.CompareTo(b)
                    where condition != 0
                    select new { a, b, condition }
                )
                group o by
                    o.condition < 0 ? o.a + "-" + o.b : o.b + "-" + o.a into g
                select g.Select(n => n.a + "-" + n.b).Take(1).ToArray()[0];


6 commentaires

@Daniel - C'est une réponse. +1!


Sa donne uniquement a-b . Mais la sortie attendue est a-b , c-a , c-b


@Pramodh, comment accédez-vous à cette logique?


@astander: S'il vous plaît voir mon deuxième édition (exemple de code à l'aide de pour boucle )


@Euphoric Je pense que votre bowvote n'est pas justifié que la question initiale et le concept a été édité 3 fois et je n'ai pas suivi toutes les modifications.


@Andrzej Nosal: D'accord, on dirait que tu as gardé.



2
votes

Vous voulez donc tous les allumettes sauf

  • article correspondant à lui-même li>
  • article correspondant à un élément plus petit li> ul>

    et aucun duplicates. p>

    ici c'est: p> xxx pré>

    indiquer l'exigence est de 90% de la bataille. P >


    Si vous avez besoin du premier élément de l'appariement de la première liste, cela le fera: P>

    IEnumerable<string> result = 
      (
        from a in ListOne
        from b in ListTwo
        select new
        {
          A = a,
          B = b,
          Combo = a.CompareTo(b) < 0 ? a + "-" + b : b + "-" + a
        } into x
        group x by x.Combo into g
        select g.Select(x2 => x2.A + "-" + x2.B).First()
      )
    


1 commentaires

Le second montre une certaine erreur comme `ne peut pas convertir implicitement le type 'String' à 'Bool'`



2
votes
var listA = new List<string> { "A", "B", "C" };
var listB = new List<string> { "A", "B" };
var result = listA.SelectMany((a, indexA) =>
                     listB.Where((b, indexB) => 
                            listB.Contains(a) ? !b.Equals(a)&&indexB > indexA 
                                              : !b.Equals(a))
                          .Select(b => string.Format("{0}-{1}", a, b)));

0 commentaires

0
votes

Que diriez-vous de la logique de validation est ajoutée à la liste

class Program
{
    static void Main(string[] args)
    {
        List<string> a = new List<string>() { "C", "D", "L" };
        List<string> b = new List<string>() { "C", "L", "C", "D" };

        var pairValuesNotEqual = from vara in a
                from varb in b
                where vara != varb
                select new Pair(vara, varb);


        Set sets = new Set();
        sets.AddRange(pairValuesNotEqual);

        foreach (var item in sets)
        {
            Console.WriteLine(item.First + " - " + item.Second);
        }

        Console.ReadLine();
    }
}

public class Set : List<Pair>
{
    public new void AddRange(IEnumerable<Pair> pairs)
    {
        foreach (var item in pairs)
        {
            this.Add(item);
        }
    }

    public new void Add(Pair item)
    {
        if (!IsExists(item))
            base.Add(item);
    }

    private bool IsExists(Pair item)
    {
        foreach (Pair i in this)
        {
            if (i.First == item.Second && i.Second == item.First)
                return true;
        }

        return false;
    }
}


0 commentaires

0
votes

Je ne pense pas que Linq soit assez bon pour cela, je l'ai eu, mais ce n'est pas beau:

        List<string> outList = new List<string>();
        foreach (string s1 in ListOne)
        {
            foreach (string s2 in ListTwo)
            {
                if (s1 != s2 &&
                    !outList.Contains(s1 + "-" + s2) &&
                    !outList.Contains(s2 + "-" + s1))
                {
                    outList.Add(s1 + "-" + s2);
                }
            }
        }


0 commentaires