簡體   English   中英

LINQ獲取不同的值並填寫LIST

[英]LINQ Get Distinct values and fill LIST

我試圖找出是否可以使用LINQ向我提供我在DataTable(FirstName,LastName,QTY)中的一些數據的不同值。 我可以獲得不同的值並填充我的列表,但我必須運行兩個不同的LINQ查詢來獲取它....我相信有更好的方法來做到這一點:)

任何建議將不勝感激(LINQ非常新)

碼:

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

任何理由都不要簡單地在不同之后進行投影,你可能需要在Distinct之后的AsEnumerable(),但這不是什么大不了的事。

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

從您的問題中不清楚數量是DataTable中的值,還是給定項目的重復數量,如Ecyrb的答案。 但是,如果您StudentData類實現IEquatable<StudentData>或覆蓋Equals方法,這應該工作:

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

如果StudentData不支持值比較,並且您無法將該支持添加到類中,則可能必須創建IEqualityComparer<StudentData>並將其傳遞給Distinct方法。

很確定你可以這樣做......

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

你可以使用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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM