2008-12-15 88 views
1

我想聯盟,合併在一個列表中包含兩個引用,所以這是我的代碼,我如何定義一個列表準備這porpouses?聯盟兩列表

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

這是一個rowcommand事件。謝謝!

回答

4

如果你想從AftList2添加所有條目lstAux你應該定義AftList2爲IEnumerable <>與DetalleCita類型的元素(即IEnumerable<DetalleCita>足夠的List<DetalleCita>被用作AddRange()參數)。例如像這樣:

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

然後你就可以將其所有的元素添加到lstAux

lstAux.AddRange(AftList2); 

澄清:

我想你是誤會什麼擴展方法ToList()一樣。它IEnumerable<T>創建新列表,其結果與其應用於的原始IEnumerable<T>沒有關聯。

這就是爲什麼你只是做沒有什麼用處試圖做list.ToList().AddRange(...) - 要複製列表清單(另一個新的ToList()創建),更新它,然後基本上扔掉它(因爲你甚至沒有做這樣的事情list2 = var1.ToList() ,原來的var1在此之後保持不變!!!如果您打電話給它,最有可能要保存ToList()的結果)。

而且你通常不會需要一個列表轉換爲另一列表中,當你需要列表(List<T>),但有IEnumerable<T>(不是可轉位,你可能需要通過索引,或懶惰求值,但快速訪問ToList()是有用即使anotherInts是查詢ints不能轉換List<int>List<int>的結果,因爲它不是 - IEnumerable<int> ints = from i in anotherInts where i > 20 select i;: - 你需要在這個時候所有的計算結果都情況可能試圖使用LINQ的結果對象查詢例如出現列表,但執行IEnumerable<int>。在這種情況下,您可以使用ToList()來獲取列表:List<int> ints = (from i in anotherInts where i > 20 select i).ToList();)。

UPDATE:

如果你真的是工會的語義(如{1,2}和{1,3} 工會會像{1,2,3},沒有重複的平等來自兩個集合的元素)考慮切換到HashSet<T>(它最有可能在您的情況下可用,因爲您使用C#3.0,我想你有最近的.NET框架)或使用Union()擴展方法,而不是AddRange(我不認爲這是比第一種解決方案更好,因爲它更像ToList() - a.Union(b)返回新的集合並且不更新ab)。