[英]C# Linq Class with Distinct List
我在嘗試獲取我的類對象的不同列表時遇到問題。
對於此特定查詢,我只想獲取DLType,我的列表中多次出現3種類型的“ DLType”。 我只想從數據中獲取這三種類型,並將其用於組合框的數據源。
這是我的課:-
public class DistributionList
{
public int DistributionID { get; set; }
public string DistributionName { get; set; }
public string DLType { get; set; }
}
這是我獲取數據的地方:
public List<DistributionList> GetDistributionLists()
{
DataTable dt = new DataTable();
OleDbCommand cmd = new OleDbCommand("Select * FROM [DistributionLists]",
Connection);
Adapter.SelectCommand = cmd;
Connection.Open();
Adapter.SelectCommand.ExecuteNonQuery();
Adapter.Fill(dt);
Connection.Close();
var DistributionLists = (from d in dt.AsEnumerable()
select new DistributionList
{
DistributionID = d.Field<int>("DistributionID"),
DistributionName = d.Field<string>("DistributionName"),
DLType = d.Field<string>("DLType")
}).ToList();
return DistributionLists;
}
在這里,我將數據放入表單:
var distributionData = dc.GetDistributionLists();
現在我需要從distributionData對象中獲得一個不同的列表:-
var query = (from d in distributionData
select new DistributionList
{
DLType = d.DLType
}).Distinct().ToList();
但這是行不通的,有辦法嗎?
Linq的問題在於,它會為每個值生成一個新的DistributionList
並且由於它們都是不同的實例,因此Distinct
會全部返回它們。 嘗試重新排序查詢的方式,如下所示:
var query = (from d in distributionData select d.DLType)
.Distinct()
.Select(t => new DistributionList() { DLType = t })
.ToList();
您需要在DistributionList
類上實現Equals
。 有關詳細信息,請參見此答案 。
不要選擇new DistributionList
,請選擇DLType
distributionData.Select(d => d.DLType).Distinct().ToList();
您只需要按一些唯一的鍵對列表進行分組,然后從每個組中選擇第一個元素,就可以像這樣
(from d in distributionData
select new DistributionList
{
DLType = d.DLType
}).GroupBy(a=>a.DLType).Select(a=>a.First()).ToList()
您可以對不同的方法使用Lambda比較器:
public class LambdaComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> _lambdaComparer;
private readonly Func<T, int> _lambdaHash;
public LambdaComparer(Func<T, T, bool> lambdaComparer) :
this(lambdaComparer, o => 0)
{
}
public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
{
if (lambdaComparer == null)
throw new ArgumentNullException("lambdaComparer");
if (lambdaHash == null)
throw new ArgumentNullException("lambdaHash");
_lambdaComparer = lambdaComparer;
_lambdaHash = lambdaHash;
}
public bool Equals(T x, T y)
{
return _lambdaComparer(x, y);
}
public int GetHashCode(T obj)
{
return _lambdaHash(obj);
}
}
然后像下面這樣使用它:
var query = (from d in distributionData
select d)
.Distinct<DistributionList>
(new LambdaComparer<DistributionList>((x, y)
=> x.DLType == y.DLType));
問候
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.