簡體   English   中英

具有明顯列表的C#Linq類

[英]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.

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