2008-12-15 18 views
1

Je veux union, fusionner dans une liste qui contient les deux références, donc ceci est mon code, comment puis-je définir une liste prête pour ces porpouses?Union deux Liste

if (e.CommandName == "AddtoSelected") 
      { 
       List<DetalleCita> lstAux = new List<DetalleCita>(); 
       foreach (GridViewRow row in this.dgvEstudios.Rows) 
       { 
        var GridData = GetValues(row); 
        var GridData2 = GetValues(row); 
        IList AftList2 = GridData2.Values.Where(r => r != null).ToList(); 
        AftList2.Cast<DetalleCita>(); 
        chkEstudio = dgvEstudios.Rows[index].FindControl("ChkAsignar") as CheckBox; 
        if (chkEstudio.Checked) 
        { 

         IList AftList = GridData.Values.Where(r => r != null).ToList(); 
         lstAux.Add(
         new DetalleCita 
         { 
          codigoclase = Convert.ToInt32(AftList[0]), 
          nombreestudio = AftList[1].ToString(), 
          precioestudio = Convert.ToDouble(AftList[2]), 
          horacita = dt, 
          codigoestudio = AftList[4].ToString() 
         }); 
        } 
        index++; 
        //this line to merge 
        lstAux.ToList().AddRange(AftList2); 
       } 

       dgvEstudios.DataSource = lstAux; 
       dgvEstudios.DataBind(); 
      } 

Ceci est à l'intérieur d'un événement rowcommand. Merci!

Répondre

4

Si vous souhaitez ajouter toutes les entrées AftList2-lstAux vous devez définir AftList2 comme IEnumerable <> avec des éléments de type DetalleCita (être IEnumerable<DetalleCita> est suffisant pour être utilisé comme paramètre de AddRange() sur List<DetalleCita>). Par exemple comme ceci:

var AftList2 = GridData2.Values.Where(r => r != null).Cast<DetalleCita>(); 

Et vous pouvez ajouter tous les éléments à lstAux:

lstAux.AddRange(AftList2); 

Précision:

Je pense que vous comprenez mal quelle méthode sont l'extension ToList() fait. Il crée nouvelle liste de IEnumerable<T> et son résultat n'est pas connecté avec l'original IEnumerable<T> auquel il est appliqué.

C'est la raison pour laquelle vous faites tout simplement rien d'utile d'essayer de faire list.ToList().AddRange(...) - vous liste la copie à (une autre nouvelle par ToList()) liste, mettre à jour puis jeter au fond loin (parce que vous faites quelque chose comme même pas list2 = var1.ToList() , original var1 reste inchangé après que vous voulez probablement sauvegarder le résultat de ToList() si vous l'appelez).

besoin aussi vous ne généralement pas de convertir une liste à une autre liste, ToList() est utile lorsque vous devez liste (List<T>) mais ont IEnumerable<T> (ce n'est pas indexables et vous devrez peut-être un accès rapide par index, ou paresseux, mais evalue vous avez besoin tous les résultats calculés à ce moment - les deux situations peuvent se produire tout en essayant d'utiliser la suite de LINQ à des objets requête par exemple: IEnumerable<int> ints = from i in anotherInts where i > 20 select i; - même si anotherInts était List<int> résultat de requête intsne peut pas être jeté-List<int> parce qu'il est pas liste mais implémentation de IEnumerable<int> Dans ce cas, vous pouvez utiliser ToList() pour obtenir la liste quand même: List<int> ints = (from i in anotherInts where i > 20 select i).ToList();).

MISE À JOUR:

Si vous voulez vraiment dire la sémantique du syndicat (par exemple pour {1, 2} et {1, 3} union serait quelque chose comme {1, 2, 3}, sans duplication de l'égalité éléments de deux collections) envisager de passer à HashSet<T> (il est très probablement disponible dans votre situation parce que vous utilisez C# 3.0 et je suppose que vous avez récent framework .NET) ou utilisez la méthode d'extension Union() au lieu de AddRange (Je ne pense pas que ce soit mieux que la première solution et faites attention car cela fonctionne plus comme ToList() - a.Union(b) retourner une nouvelle collection et ne met PAS à jour soit a ou b).