LINQ获取不同的值并填写LIST

我试图弄清楚我是否可以使用LINQ为我提供DataTable(FirstName,LastName,QTY)中的一些数据的不同值。 我可以得到不同的值并填充我的列表,但我必须运行两个不同的LINQ查询来获取它….我相信有更好的方法来做到这一点:)

任何建议将不胜感激(对LINQ来说很新)

码:

public static List LinqDistinct(DataTable dt) { DataTable linqTable = dt; //get the distinct values var query = (from names in dt.AsEnumerable() select new { FirstName = names.Field("FirstName"), LastName = names.Field("LastName") }).Distinct(); //fill my list with the distinct values List sList = (from sa in query.AsEnumerable() select new StudentData { FirstName = sa.FirstName, LastName = sa.LastName //Qty = names.Field("Qty") }).ToList(); return sList;} 

任何理由都不能简单地在不同之后进行投影,你可能需要在Distinct之后使用AsEnumerable(),但这不是什么大问题。

 public static List LinqDistinct(DataTable dt) { DataTable linqTable = dt; return (from names in dt.AsEnumerable() select new { FirstName = names.Field("FirstName"), LastName = names.Field("LastName") }).Distinct().Select(x => new StudentData() { FirstName=x.FirstName, LastName=x.LastName}) .ToList(); } 

从您的问题中不清楚数量是DataTable中的值,还是给定项目的重复数量,如Ecyrb的答案。 但是,如果您的IEquatable类实现IEquatable或重写Equals方法,则应该可以:

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

如果StudentData不支持值比较,并且您无法将该支持添加到类中,则可能必须创建IEqualityComparer并将其传递给Distinct方法。

很确定你可以这样做……

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

你可以使用GroupBy

 public static List LinqDistinct(DataTable dt) { List results = dt.AsEnumerable() .GroupBy(row => { FirstName = row.Field("FirstName"), LastName = row.Field("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; } }