Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LINQ Get Distinct values and fill LIST

Tags:

c#

linq

I am trying to figure out if I can use LINQ to provide me with the distinct values of some data I have in a DataTable (FirstName, LastName, QTY). I can get the distinct values and fill my List, but I have to run two different LINQ queries to get it....I am sure there is a better way to do it :)

Any suggestions would be greatly appreciated (very new to LINQ)

Code:

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;}
like image 875
scarpacci Avatar asked Nov 23 '09 23:11

scarpacci


2 Answers

Any reason not to simply do the projection after the distinct, you might need an AsEnumerable() after the Distinct but that's not a big deal.

public static List<StudentData> LinqDistinct(DataTable dt)
{
    DataTable linqTable = dt;
    return
        (from names in dt.AsEnumerable()
         select new {
             FirstName = names.Field<string>("FirstName"),
             LastName = names.Field<string>("LastName")
         }).Distinct().Select(x =>
             new StudentData() { FirstName=x.FirstName, LastName=x.LastName})
             .ToList();
}
like image 167
ShuggyCoUk Avatar answered Oct 09 '22 21:10

ShuggyCoUk


It's not clear from your question whether the quantity is a value in your DataTable, or a count of the number of duplicates for a given item, as in Ecyrb's answer. However, if your StudentData class implements IEquatable<StudentData> or overrides the Equals method, this should work:

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

If StudentData doesn't support value comparison, and you can't add that support to the class, you may have to create an implementation of IEqualityComparer<StudentData> and pass that into the Distinct method.

like image 5
Joel Mueller Avatar answered Oct 09 '22 22:10

Joel Mueller