2016-07-28 35 views
3

我正在開發使用.NET Framework 2.0開發的舊項目。 在這個項目中,我從ItemNo列中得到DataRowCollection的不同值。我只對ItemNo感興趣。 DataRowItemNo,QtyDate組成。從.NET 2.0中的DataTable列中獲取不同的值

我想迭代DataRowCollection並加入獨特的ItemNo成如下(未測試)

var items = new List<string>(); 
foreach (DataRow orderItem in rows) 
{ 
    var itemNo = orderItem["ITEMNO"].ToString().Trim(); 
    if(items.Find(delegate(string str) { return str == itemNo ;}) == null) 
    { 
      items.Add(itemNo); 
    } 
} 

是否有這樣做沒有LINQ的一種更好的方式串的名單(.Net框架2.0犯規像LINQ)

+0

您使用'Contains'方法從'List'中找到'specific item'。 if(items.Contains(itemNo)) {item} .Add(itemNo); }' – mmushtaq

+0

如何在您的收藏中不運行n^2併爲您的項目使用字典 – Didaxis

+0

您的意思是您需要來自'ITEMNO'列的不同值? –

回答

2
// Given a data table: 
var dt = new DataTable(); 
dt.Columns.Add("ITEMNO"); 
dt.Rows.Add("1 "); 
dt.Rows.Add(" 1"); 
dt.Rows.Add("2"); 

var dict = new Dictionary<string, bool>(); 

foreach(DataRow dr in dt.Rows) 
{ 
    var itemNo = dr["ITEMNO"].ToString().Trim(); 

    // Take advantage of O(1) lookup: 
    if (!dict.ContainsKey(itemNo)) 
    { 
     dict.Add(itemNo, true); 
    } 
} 

// Get list from dictionary keys: 
var items = new List<string>(dict.Keys); 

如果您可以在服務器上安裝.Net 3.5,在應用程序中引用System.Core.dll,您可以利用HashSets將要修改上面的代碼:

var hashSet = new HashSet<string>(); 

foreach(DataRow dr in dt.Rows) 
{ 
    var itemNo = dr["ITEMNO"].ToString().Trim();  

    // Only unique elements are added to the hash set, 
    // no need to check for duplicates 
    hashSet.Add(itemNo);  
} 

var items = new List<string>(hashSet); 

的好處在字典上使用HashSet無疑是微不足道的,但我更喜歡它,因爲我不關心字典中的任意bool值,但是您需要滿足.Net 3.5和參考必備條件。

1

爲了得到不同的值形成一列,你可以使用這個方法:

List<T> SelectDistict<T>(DataTable table, string column) 
{ 
    DataTable temp = new DataView(table).ToTable(true, column); 
    List<T> items = new List<T>(); 
    foreach (DataRow row in temp.Rows) 
     items.Add(row.Field<T>(column)); 
    return items; 
} 

在我用上述方法DataView.ToTable通過傳遞true作爲第一個參數,選擇不同的值。

下面是使用例子:

List<string> items = SelectDistict<string>(yourDataTable, "ITEMNO"); 

注意

如果您需要修剪值,你可以改變上面的代碼,並首先創建DataTable的克隆副本。然後通過分配TRIM(column)Expression列的屬性,添加一個計算列,其中包含從給定列名稱中截取的不同值。然後按照上面的代碼使用新的修剪列的步驟。