2016-07-28 8 views
3

.NET Framework 2.0を使用して開発されたレガシープロジェクトで作業しています。 このプロジェクトでは、DataRowCollectionから別の値をItemNoカラムまで取得します。私はItemNoにのみ興味があります。 DataRowは、ItemNo,QtyおよびDateからなる。.NET 2.0でDataTableの列と異なる値を取得

私は

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

(テストしていない)DataRowCollectionを反復し、以下のように文字列のリストにユニークなItemNoを追加することを考えていますがLINQなしでこれを行うための良い方法はあります(.NET Framework 2.0のdoesntのLINQ)

+0

'Contains'メソッドを使用して' List'から '特定のアイテム'を検索します。 'if(!items.Contains(itemNo)) { items.Add(itemNo); } ' – mmushtaq

+0

あなたのコレクションにn^2を実行せず、あなたのアイテムに辞書を使用しないでください – Didaxis

+0

' ITEMNO'カラムのDistinct値が必要なのですか? –

答えて

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

利益をDictionaryを使ってHashSetを使うのは簡単ですが、私は辞書の任意のbool値を気にしないので好きですが、.Net 3.5とreferenceの必要条件を満たす必要があります。

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.ToTabletrueを第1引数として渡すことによって、別個の値を選択する。ここで

は使用例です:

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

あなたが値をトリミングする必要がある場合は、上記のコードに変更し、最初のDataTableのクローンコピーを作成することができます。次に、列のプロパティーTRIM(column)Expressionの値を代入することにより、指定された列名から切り捨てられた値を含む計算列を追加します。次に、上記のコードのように新しいトリムされた列を使用して手順を実行します。

関連する問題