1

我在尝试获取我的类对象的不同列表时遇到问题。

对于这个特定的查询,我只对获取 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();

但这不起作用,有没有办法做到这一点?

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

您可以将 Lambda 比较器用于 Distinct 方法:

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 回答