2011-11-29 3 views
0

다음과 같은 DataTable이 있습니다. 누군가 Linq를 사용하여 문자열 길이 규칙의 DataTable을 기반으로 행 값을 잘라내는 멋진 방법을 알고 있는지 궁금합니다. 데이터의.NET 4.0 Update의 DataTable과 LINQ?

테이블 : 규칙의

 var testtable = new DataTable(); 
     testtable.Columns.Add("cola" , typeof(String)); 
     testtable.Columns.Add("colb" , typeof(String)); 
     testtable.Columns.Add("colc" , typeof(String)); 
     testtable.Rows.Add(new object[] { "1" , "22" , "333" }); 
     testtable.Rows.Add(new object[] { "4444" , "55555" , "666666" }); 
     testtable.Rows.Add(new object[] { "7777777" , "88888888" , "999999999" }); 

테이블 : 데이터의

 var ruletable = new DataTable(); 
     ruletable.Columns.Add("columnname" , typeof(String)); 
     ruletable.Columns.Add("length" , typeof(Int32)); 
     ruletable.Rows.Add(new object[] { "colb" , 3 }); 
     ruletable.Rows.Add(new object[] { "colc" , 4 }); 

실생활 테이블 180 열 및 1,000 행이 있습니다. 규칙 테이블에는 180 행 (열당 하나)이 있습니다. 그래서 전문가는 루텍에서 무엇이 루마 트에 기반한 테스트 테이블의 가장 왼쪽 문자를 가져올 수 있는지에 대해 의견을 나눌 수 있기를 희망합니다.

감사합니다.

+0

저는 DataTable.AsEnumerable 및 SetField를 가지고 놀고 있지만 지금까지는 아무 것도 얻지 못하고 있습니다. – Snowy

답변

1

이것은 당신이 찾고있는 것만 큼 화려하지는 않지만 (그리고 Linq을 사용하지는 않았지만) 간단하고 효과적입니다. 내가 VB에서 쓴 이유는 조금 더 빠르지 만 C#으로 대답을 편집해야하는 경우 몇 분 안에 할 수있다.

'loop through all of the rows in testtable' 
For Each tr As Data.DataRow In testtable.Rows 
    tr.BeginEdit() 

    'loop through all of the rules' 
    For Each drrule As Data.DataRow In ruletable.Rows 
     'update the value in testtable column represented by rule rows "columnname" field' 
     'based on the rules rows "length" field' 
     tr(drrule("columnname")) = Left(tr(drrule("columnname")), drrule("length")) 
    Next 
    tr.AcceptChanges() 
Next 

내가 C#으로 다시 작성해야하는 경우 알려 주시면 최대한 빨리 수정하겠습니다.

1

LINQ는별로 도움이되지 않습니다. 일반적으로 데이터를 쿼리하고 변경하는 것이 아닙니다. 각 행의 상태를 업데이트하려면 명령형 접근 방식을 사용하는 것이 좋습니다. 중첩 된 foreach이 가장 적절할 것입니다.

foreach(var ruleRow in ruleTable.AsEnumerable()) 
{ 
    var columnName = ruleRow.Field<string>("columnname"); 
    var length = ruleRow.Field<int>("length"); 

    foreach(var testRow in testTable.AsEnumerable()) 
    { 
     var value = testRow.Field<string>(columnName); 

     testRow.SetField(columnName, value.Substring(0, length)); 
    } 
} 

LINQ가에서 가장 잘린 값을 조회하는 데 사용할 수 있습니다,하지만 당신은 여전히 ​​업데이트를 수행 할 foreach을해야 할 것입니다 : 당신은 testTable의 모든 행의 길이를 분석 방지하기 위해 먼저 규칙을 반복한다 . 가장 LINQ가 에있는 .AsEnumerable() 방법입니다.