2016-07-28 34 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列的属性,添加一个计算列,其中包含从给定列名称中截取的不同值。然后按照上面的代码使用新的修剪列的步骤。