Pregunta

Estoy escribiendo mi propia referencia LINQ, pero Im que consigue problemas con algunas de las implementaciones de los operadores más complicado.

Hay una aplicación que toma un IEqualityComparer Im que consigue una locura de Ingreso.

Im tratando de entender primero antes de escribir (obviamente)

imagen Esta dos listas:

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

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

No hay nada raro aquí. Quiero unirme a las dos listas por la inicial, algo como:

  

inicial = Una palabra = Ant
  Inicial = Una palabra = Arco
  Inicial = B = Palabra BARCO DE   ...

Necesito un comparador, escribí esto:

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

El juntarse:

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

Es la primera vez Im usando hashcodes, después de una buena sesión de depuración veo que cada palabra Ir al comparador mirada y en su HashCode, si una palabra tiene el mismo HashCode que llama iguales.

Desde quiero comparar sólo la inicial I a pesar de que sólo necesito la primera letra Hash (¿Me equivoco?)

El caso es que esto no está funcionando correctamente. Su dice que "hormiga" y "Arc" son iguales, está mal, es la comparación de cada palabra en la misma lista o no, pero se añade sólo la última palabra que encuentra, en este caso del arco, haciendo caso omiso de la hormiga y la hormiga es igual a "A "demasiado ...

Si pongo "hormiga" y "Hormiga" que importe tanto.

En pocas palabras, ¿Cuál es la forma de hacer algo por el estilo? Sé que estoy haciendo algo mal.

Gracias.

¿Fue útil?

Solución

Como se mencionó intento Crujiente     x [0] == y [0] en lugar de     x.StartsWith (y); Eso funcionó para mí.

Otros consejos

Usted no necesita realmente su propio comparador de igualdad, simplemente se unen en la carta individual, así:

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

No estoy seguro de por qué usted está viendo este comportamiento, pero creo que el uso de "SelectMany" sería un enfoque más sencillo y (lo más importante) tiene el comportamiento que desea:

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

Yo prefiero usar la sintaxis de comprensión cuando sea posible. "SelectMany" se invoca cuando hay múltiples "de" cláusulas en una consulta comprensión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top