2012-08-22 3 views
0

J'ai un problème en essayant d'obtenir une liste Distinct de mes objets de classe.C# LINQ classe avec liste Distinct

Pour cette requête particulière, je ne suis intéressé à saisir le DLType, Il y a 3 types de « DLType » qui apparaissent dans ma liste à plusieurs reprises. Je veux juste saisir ces trois types de données et de l'utiliser pour la source de données pour une zone de liste déroulante.

Voici ma classe: -

public class DistributionList 
{ 
    public int DistributionID { get; set; } 
    public string DistributionName { get; set; } 
    public string DLType { get; set; } 
} 

Voici où je prends les données: -

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; 

} 

Ici je tire les données dans mon formulaire: -

var distributionData = dc.GetDistributionLists(); 

maintenant, je dois obtenir une liste distincte de l'objet distributionData: -

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

         }).Distinct().ToList(); 

Mais cela ne fonctionne pas, est-il un moyen de le faire?

Répondre

1

Le problème avec votre Linq est qu'il génère un nouveau DistributionList pour chaque valeur - et comme ce sont toutes des instances différentes, Distinct les renvoie toutes. Essayez réorganisant la façon dont vous traitez la requête, quelque chose comme ceci:

var query = (from d in distributionData select d.DLType) 
        .Distinct() 
        .Select(t => new DistributionList() { DLType = t }) 
        .ToList(); 
+0

qui a travaillé! Merci! Je suis coincé là-dessus depuis des lustres! Je suis nouveau à LINQ! – Derek

1

Vous devez mettre en œuvre Equals votre classe DistributionList. Voir this answer pour plus de détails.

1

ne sélectionnez pas new DistributionList, sélectionnez DLType

distributionData.Select(d => d.DLType).Distinct().ToList(); 
1

vous avez juste besoin de la liste des groupes par une clé unique et après sélectionnez le premier élément de chaque groupe, quelque chose comme ça

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

         }).GroupBy(a=>a.DLType).Select(a=>a.First()).ToList() 
0

Vous pourriez utiliser un Lambda Comparer pour la méthode 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); 
    } 
} 

puis l'utiliser comme suit:

var query = (from d in distributionData 
      select d) 
      .Distinct<DistributionList> 
      (new LambdaComparer<DistributionList>((x, y) 
           => x.DLType == y.DLType)); 

Salutations