1

クラス オブジェクトの個別リストを取得しようとして問題が発生しました。

この特定のクエリでは、DLType を取得することにのみ関心があります。リストに複数回表示される「DLType」には 3 つのタイプがあります。これら 3 つのタイプをデータから取得し、それをコンボ ボックスのデータソースに使用したいだけです。

これが私のクラスです:-

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

しかし、これはうまくいきません。これを行う方法はありますか?

4

5 に答える 5

2

Linq の問題は、DistributionList値ごとに新しい値が生成されることです。それらはすべて異なるインスタンスであるため、すべてDistinctが返されます。次のように、クエリを処理する方法を並べ替えてみてください。

var query = (from d in distributionData select d.DLType)
                  .Distinct()
                  .Select(t => new DistributionList() { DLType = t })
                  .ToList();
于 2012-08-22T11:54:53.510 に答える
1

クラスに実装する必要がありEqualsます。DistributionList詳細については、この回答を参照してください。

于 2012-08-22T11:55:51.200 に答える
1

選択しないnew DistributionListで、選択してくださいDLType

distributionData.Select(d => d.DLType).Distinct().ToList();
于 2012-08-22T11:58:21.147 に答える
1

リストを一意のキーでグループ化し、各グループから最初の要素を選択した後、次のようにするだけです

(from d in distributionData
                         select new DistributionList
                         {
                             DLType = d.DLType

                         }).GroupBy(a=>a.DLType).Select(a=>a.First()).ToList()
于 2012-08-22T11:59:22.867 に答える
0

Distinct Method に Lambda Comparer を使用できます。

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

ご挨拶

于 2012-08-22T13:05:02.077 に答える