2013-10-07 69 views
0

我使用C#2010如何從DataTable對象中選擇不同的列組合作爲條件?

我有一個數據表對象我正在與具有以下結構(並填充有樣品的數據):

"name" "ID" "hiredate" "termdate" 
Bobby  1  5/1/2011  7/1/2011 
Peggy  2  5/1/2011 
Jenny  3  5/2/2011 
Jenny  3  5/2/2013 
Jenny  3  5/2/2011  6/1/2011 
Peggy  2  5/1/2011 

欲篩選此數據表只保留不同的(「ID」,「入職」)組合。此外,正如您所看到的,並非每個人都有「期限」價值。當決定保留哪個不同的(「ID」,「hiredate」)組合時,我想保留也有「termdate」的組合。如果其中沒有任何「termdate」,則丟棄哪一個並不重要。

所以這樣做後,所得到的表是:

"name" "ID" "hiredate" "termdate" 
Bobby  1  5/1/2011  7/1/2011 
Peggy  2  5/1/2011 
Jenny  3  5/2/2013 
Jenny  3  5/2/2011  6/1/2011 

珍妮有兩個條目,因爲她出現了兩個不同的「HIREDATE」的價值觀,其中之一也被複制 - 沒有「termdate項「 去掉了。

有關如何在C#中執行此操作的任何建議?同樣,我正在使用一個DataTable對象。我仍然需要保留「名稱」和「termdate」字段 - 如果我沒有,那麼我可以得到一個明確的(「ID」,「hiredate」)列表,但他們確實需要保留。

感謝您的幫助!

+0

你是如何填充數據表中第一名?如果它來自數據庫,那麼這可能是將其過濾掉的最佳位置。 – user1948635

+0

正在從CSV文件讀取數據,可能還有用戶輸入,所以用SQL命令過濾不是首選選項。 – src

+0

啊,我明白了,這會讓事情變得更加容易..將發佈我將如何處理下面的數據表。 – user1948635

回答

0

我可能會做這樣的事情,DT是你原來的數據表 -

這應包括由於數據視圖的排序所有的可能性,這是維護日期列表允許添加多個租賃日期一個用戶。

  DataView dv = new DataView(dt); 
      dv.Sort = "ID ASC, HireDate DESC, TermDate DESC"; 

      string lastID = "0"; 
      List<DateTime> addedHireDatesForUser = new List<DateTime>(); 

      foreach (DataRowView drv in dv) 
      { 
       if (drv["ID"].ToString() != lastID) 
       { 
        addedHireDatesForUser = new List<DateTime>(); 
        addedHireDatesForUser.Add(DateTime.Parse(drv["HireDate"].ToString())); 

        // NEXT ID, ADD ROW TO NEW DATATABLE 
       } 
       else if (!addedHireDatesForUser.Contains(DateTime.Parse(drv["HireDate"].ToString()))) 
       { 
        addedHireDatesForUser.Add(DateTime.Parse(drv["HireDate"].ToString()); 

        // NEXT DATE, ADD ROW TO NEW DATATABLE 
       } 

       lastID = drv["ID"].ToString(); 
      } 
+0

只需調整一些東西,它的工作完美。謝謝!! – src

+0

沒問題,很高興它爲你工作。 – user1948635

0

這是僞代碼,未經測試,但這可能會讓您開始。

 //Get rows with distinct name, ID hiredate 
     DataView dview = new DataView(table); 
     DataTable distinctValues = dview.ToTable(true, "name", "ID", "hiredate"); 

     //Get rows with termdate not null 
     DataView tview = new DataView(table, "Isnull(termdate,'') <> ''", "ID", DataViewRowState.CurrentRows); 
     DataTable termValues = tview.ToTable(true, "name", "ID", "hiredate", "termdate"); 

     DataTable result = new DataTable("Table"); 
     foreach (DataRow r in distinctValues.Rows) 
     { 
      DataRow[] compare = termValues.Select(string.Format("name='{0}' AND ID='{1}' AND hiredate='{2}'", r["name"], r["ID"], r["hiredate"])); 
      //If a value exists with a termdate use it 
      if (compare != null && compare.Length > 0) 
      { 
       DataRow row = result.NewRow(); 
       row["name"] = compare[0]["name"]; 
       row["ID"] = compare[0]["ID"]; 
       row["hiredate"] = compare[0]["hiredate"]; 
       row["termdate"] = compare[0]["termdate"]; 
       result.Rows.Add(row); 
      } 
      // Otherwise use the distinct value 
      else 
      { 
       DataRow row = result.NewRow(); 
       row["name"] = r["name"]; 
       row["ID"] = r["ID"]; 
       row["hiredate"] = r["hiredate"]; 
       result.Rows.Add(row); 
      } 
     } 
+0

感謝您的回答。我和另一個人一起去了,因爲它更加充實,而且我有點時間緊張,但是當我回來對我的代碼進行進一步改進時,我一定會重新考慮這一點。 – src

0

若要從數據表中獲取值的獨特列表...

DataView dv = new DataView(dt); 
DataTable dtResults = dv.ToTable(true, "name", "ID", "hiredate"); 

然後將termdates ...

dtResults.Columns.Add("termdate", typeof(DateTime)); 
foreach (DataRow dr in from x in dt.Rows.Cast<DataRow>() where !x.IsNull("termdate") select x) { 
    DataRow drResult = dtResults.Select(string.Format("name=\'{0}\' and ID=\'{1}\' and hiredate=\'{2}\'", dr["name"], dr["ID"], dr["hiredate"])).Single(); 
    drResult["termdate"] = dr["termdate"]; 
} 
+0

我確實相信這個解決方案可以正常工作。不過,我更喜歡其他的,因爲我將來可能會增加更多列,因此將它們全部列出可能會變得笨拙。 – src

相關問題