2009-11-23 25 views
15

Estoy tratando de averiguar si puedo usar LINQ para proporcionarme los valores distintivos de algunos datos que tengo en una DataTable (FirstName, LastName, QTY). Puedo obtener los valores distintos y completar mi lista, pero tengo que ejecutar dos consultas LINQ diferentes para obtenerla ... Estoy seguro de que hay una mejor manera de hacerlo :)LINQ Obtenga valores distintos y complete LIST

Cualquier sugerencia sería muy apreciada (muy nuevo para LINQ)

Código:

public static List<StudentData> LinqDistinct(DataTable dt) 
{ 
     DataTable linqTable = dt; 

     //get the distinct values 
     var query = 
      (from names in dt.AsEnumerable() 
      select new { 
       FirstName = names.Field<string>("FirstName"), 
       LastName = names.Field<string>("LastName") 
      }).Distinct(); 


     //fill my list with the distinct values 
     List<StudentData> sList = (from sa in query.AsEnumerable() 
            select new StudentData 
               { 
                FirstName = sa.FirstName, 
                LastName = sa.LastName 
                //Qty = names.Field<int>("Qty") 

               }).ToList();            



     return sList;} 

Respuesta

19

Cualquier razón para no hacer simplemente la proyección después de la distinta, es posible que necesite un AsEnumerable() después del Distintivo, pero eso no es un gran problema.

+0

Acabo de ver esto ... ¡esto es perfecto! ¡Ahora ni siquiera tengo que usar el IEqualityComparer !. Gracias. – scarpacci

1

bastante seguro de que sólo podía hacer esto ...

List<StudentData> sList = (from names in dt.AsEnumerable().Distinct() // I am not sure if you even have to call AsEnumerable() 
       select new StudentData() { 
        FirstName = names.Field<string>("FirstName"), 
        LastName = names.Field<string>("LastName") 
       }).ToList(); 
+0

Esto podría no funcionar, porque está pidiendo una lista distinta de objetos DataRow, que probablemente hará comparaciones de referencia y decidirá que sus datos ya son distintos. Pero necesita la llamada AsEnumerable() en DataTable (simplemente no en la consulta, en el código original). –

+0

Lo anterior todavía no me da las distintas filas que estaba buscando ... gracias por la respuesta :) S – scarpacci

1

usted podría utilizar GroupBy:

public static List<StudentData> LinqDistinct(DataTable dt) 
{ 
    List<StudentData> results = dt.AsEnumerable() 
     .GroupBy(row => 
     { 
      FirstName = row.Field<string>("FirstName"), 
      LastName = row.Field<string>("LastName") 
     }) 
     .Select(group => new StudentData 
     { 
      FirstName = group.Key.FirstName, 
      LastName = group.Key.LastName, 
      Qty = group.Count() 
     }) 
     .ToList(); 

    return results; 
} 

class StudentData 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Qty { get; set; } 
} 
+0

Voy a dar una oportunidad – scarpacci

5

No está claro por su pregunta si la cantidad es un valor en su DataTable, o un recuento de la cantidad de duplicados para un elemento determinado, como en la respuesta de Ecyrb. Sin embargo, si su clase implementa StudentDataIEquatable<StudentData> o anula el método Equals, esto debería funcionar:

public static List<StudentData> LinqDistinct(DataTable dt) 
{ 
    return dt.AsEnumerable() 
      .Select(row => new StudentData 
          { 
           FirstName = row.Field<string>("FirstName"), 
           LastName = row.Field<string>("LastName"), 
           Qty = row.Field<int>("Qty") 
          }) 
      .Distinct() 
      .ToList(); 
} 

Si StudentData no admite comparación de valores, y no se puede añadir que el apoyo a la clase, puede que tenga que cree una implementación de IEqualityComparer<StudentData> y páselo al método Distinct.

+0

Pido disculpas .... FirstName, LastName, QTY están en el datatable, pero solo quiero devolver FirstName/LastName. Le daré una oportunidad a su método. ¡Gracias! – scarpacci

+0

+1 Creo que esta es su mejor apuesta ... – bytebender

+0

Esto funcionó! Gracias Joel! – scarpacci

Cuestiones relacionadas