2010-02-14 9 views
8

Estoy tratando de obtener una lista distinta de las palabras de una serie de palabras con el siguiente código:Seleccionar Distinto lista de acciones de matriz con LINQ

string words = "this is a this b"; 

var split = words.Split(' '); 

IEnumerable<Word> distinctWords = (from w in split 
          select new Word 
            { 
             Text = w.ToString() 
            } 
         ).Distinct().ToList(); 

pensé que esto llevaría a cabo la doble ocurrencia de 'this' pero devuelve una lista de cada palabra en la frase.

¿Puede alguien sugerir por favor cómo puedo conseguir una lista distinta? Gracias

de Dave

+0

¿No debería ser la segunda línea de 'string [] = divididas palabras. Split() '? –

+0

D'Oh! - @ Mark, tienes razón. Supongo que tengo un poco descuidado con mi copiar/pegar - Lo he arreglado ahora. Sin embargo, ¡había tenido uno o dos vasos en esa etapa! :-) – DaveDev

Respuesta

19

En el ejemplo, cada objeto de Word es distinta, porque no hay comparación que mira a la propiedad Text.

Sin embargo, no hay razón para crear un nuevo objeto:

var distinctWords = (from w in split 
         select w).Distinct().ToList(); 

O más simplemente:

var distinctWords = new List<string>(split.Distinct()); 
1

No se han publicado el código de su clase Word, pero mi conjetura es que no implementa Equals con una comparación de valor para que pueda obtener la implementación predeterminada de Equals que acaba comprueba el objeto referencias. Tenga en cuenta que si decide implementar su propia versión de Equals, también debe implementar correctamente GetHashCode.

Una forma alternativa de resolver este problema es proporcionar un IEqualityComparer como un parámetro para la función Distinct.

1

El problema es que crea varios objetos de Word que contienen el mismo valor, pero, ¿cómo debe saber el compilador, que estos serán los mismos elementos?

Trate

(from w in split.Distinct() 
select new Word { Text = w.ToString()}).ToList(); 
0

Como otros han dicho, el problema es probablemente que su objeto Word no implementa estructural igualdad (compare el contenido real, no referencias de instancia). Si aún desea obtener una colección de objetos Word como el resultado, pero el uso de Distinct en los valores de cadena subyacentes, puede escribir esto:

IEnumerable<Word> distinctWords = 
    (from w in split.Distinct() 
    select new Word { Text = w.ToString() }).ToList(); 
Cuestiones relacionadas