2016-07-28 4 views
3

.NET Framework 2.0을 사용하여 개발 된 기존 프로젝트를 작업하고 있습니다. 이 프로젝트에서 DataRowCollection부터 ItemNo 열까지 구별되는 값을 얻습니다. 나는 ItemNo에만 관심이 있습니다. DataRowItemNo, QtyDate으로 구성됩니다. 나는 DataRowCollection를 반복하고 다음 (테스트하지) .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); 
    } 
} 

는 LINQ없이이 일을 더 좋은 방법이 있나요 문자열의 목록에 고유 ItemNo를 추가 생각하고

(닷넷 프레임 워크 2.0 나던

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

내가 사용 위의 방법에있어서 :

+0

'Lists'에서 특정 항목을 찾기 위해'Contains' 메소드를 사용합니다. 'if (! items.Contains (itemNo)) { items.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); 

당신은 서버에 닷넷 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 및 참조 요구 사항을 충족해야합니다.

1

) LINQ와 같은 고유 한 값이이 방법을 사용할 수있는 열을 형성 얻으려면 DataView.ToTabletrue을 첫 번째 인수로 전달하여 고유 한 값을 선택합니다.

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

당신이 값을 손질해야하는 경우에는 위의 코드를 변경하고 먼저 DataTable의 복제 복사본을 만들 수 있습니다 여기에

은 사용 예입니다. 그런 다음 TRIM(column)Expression 열의 속성을 할당하여 고유 한 값에 대해 지정된 열 이름에서 잘라낸 값을 포함하는 계산 된 열을 추가합니다. 그런 다음 위의 코드와 같이 새 다듬기 열을 사용하여 단계를 따르십시오.

관련 문제