Domanda

Im scrivere il mio riferimento LINQ ma Im ottenendo guai con alcuni degli operatori più complicate implementazioni.

C'è un'implementazione che prende un IEqualityComparer Im ottenendo semplicemente pazzesco registrazione.

Nel tentativo di capire in primo luogo prima di scrivere (ovviamente)

questa immagine due liste:

List<string> initials = new List<string> {"A", "B", "C", "D", "E"};

List<string> words = new List<string> {"Ant", "Crawl", "Pig", "Boat", "Elephant", "Arc"};

Niente di strano qui. Voglio unirmi entrambe le liste dalla iniziale, qualcosa come:

  

iniziale = Una parola = Ant
  Iniziale = Una parola = Arc
  Iniziale = B = Parola Boat
  ...

Ho bisogno di un confronto, ho scritto questo:

public class InitialComparator : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return x.StartsWith(y);
    }

    public int GetHashCode(string obj)
    {
        return obj[0].GetHashCode();
    }
}

La registrazione stessa:

var blah = initials.Join(words,
                                  initial => initial,
                                  word => word,
                                  (initial, word) =>
                                  new {Initial = initial, Word = word},
                                  new InitialComparator());

E 'la prima volta che Im usando codici hash, dopo una buona sessione di debug vedo che ogni parola andare al comparatore e un'occhiata alla sua HashCode, se un'altra parola ha lo stesso HashCode Chiede eguali.

Dato che voglio mettere a confronto solo l'ho iniziale però che ho solo bisogno la prima lettera Hash (mi sbaglio?)

Il fatto è che questo non sta funzionando correttamente. Il suo dice che "Formica" e "Arco" sono uguali, Ok, la sua confrontando ogni parola nella stessa lista o no, ma aggiunge solo l'ultima parola che trova, in questo caso Arc, ignorando Formica e formica è uguale a "A "troppo ...

Se metto "Formica" e "Formica" si aggiunge sia.

In breve, Qual è il modo di fare una cosa del genere? So che sto facendo qualcosa di sbagliato.

Grazie.

È stato utile?

Soluzione

Come accennato Crispy prova     x [0] == y [0] invece di     x.StartsWith (y); Che ha lavorato per me.

Altri suggerimenti

Come ospite non effettivamente bisogno il proprio confronto di uguaglianza, basta unire l'individuo lettera in questo modo:

var mine = from i in initials
     join w in words on i[0] equals w[0]
     select new {
          Initial = i,
          Words = w
     };

Non sono sicuro che il motivo per cui si sta vedendo questo comportamento, ma penso che l'utilizzo di "SelectMany" sarebbe un approccio più diretto e (soprattutto) ha il comportamento desiderato:

var blah =
    from word in words
    from initial in initials
    where (word.StartsWith(initial))
    select new { Initial = initial, Word = word };

Io preferisco usare la sintassi di comprensione, ove possibile. "SelectMany" viene invocato quando ci sono più "da" clausole in una query di comprensione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top