2012-10-22 2 views
2

DataRow을 반복하는 코드가 있고 DataRow의 파이프 구분 된 열을 배열로 나눠서 List<string>으로 나눕니다.배열에 대한 LINQ datarow 문자열과 문자열 목록에

LINQ를 사용하여 더 좋은 방법이 있습니까? 나는 시도했지만 아무 데있어!

List<string> allSizes = new List<string>(); 

foreach (DataRow resultRow in results.Rows) 
{ 
    if (resultRow["Sizes"] != DBNull.Value) 
    { 
     string[] sizes = resultRow["Sizes"].ToString().Split('|'); 
     foreach (string size in sizes) 
     { 
      if (!allSizes.Contains(size)) 
      { 
       allSizes.Add(size); 
      } 
     } 
    } 
} 
+0

주'목록에 Contains' 특히 효율적이지 않습니다. 데이터 세트가 커질 수 있고 각 항목에 대해 목록에 있는지 여부를 확인하면 비용이 높아질 수 있습니다. 세트 기반의 데이터 구조를 사용하여 'Distinct'를 수행하는 것이 더 좋습니다. LINQ'Distinct' 메소드가 수행하는 작업입니다. – Servy

답변

8
var allSizes = results.Rows.Cast<DataRow>() 
    .Where(row => row["Sizes"] != DBNull.Value) 
    .SelectMany(row => row["Sizes"].ToString().Split('|')) 
    .Distinct() 
    .ToList(); 
+0

당신이 이기면 ... :(+1 – Pluc

+0

확장 메서드가 훨씬 더 좋아 보인다. +1 – Laurence

0

다음은 LINQ 버전입니다하지만 개인적으로 나는 많은 청소기를 찾을 수없는이 같은

var allSizes = new List<string>(); 

foreach (
    string size in 
    from DataRow resultRow in results.Rows 
    where resultRow["Sizes"] != DBNull.Value 
    select resultRow["Sizes"].ToString().Split('|') into sizes 
    from size in sizes where !allSizes.Contains(size) 
    select size) { 
    allSizes.Add(size); 
} 
+1

OP에서 언급했듯이, 중요하지 않은 크기의 'List'에서 contains를 수행하는 것은 값싼 작업이 아닙니다. 당신은 뚜렷한 작업을 수행하기 위해 항목을 집합 기반 데이터 구조에 넣어야합니다. – Servy

+0

잘 알고있어, 고마워. – Laurence

0

뭔가.

var linqSizes = 
    from row in results.Rows 
    where row["Sizes"] != DBNull.Value 
    let sizes = row["Sizes"].ToString().Split('|') 
    from size in sizes 
    group size by size into g 
    select g.Key; 

변수 linqSizes은 변수 allSizes과 같은 요소를 포함합니다.

0

강한-입력 된 DataRow 및 LINQ : 사용하는 것을

dt.Rows.OfType<DataRow>().Where(r => r["Sizes"] != DBNull.Value) 
     .SelectMany(r=>r.Field<string>("Sizes").Split('|') 
     .Distinct().ToList(); 
관련 문제