2010-06-21 3 views
2

linq의 다음 코드에서 foreach를 꺼내는 방법이 있습니까?linq을 사용하여 foreach를 꺼내십시오

DropDownList ddl = new DropDownList(); 
    foreach (DataRow row in ds.Tables[0].Rows) 
    { 
     if ((byte)row["ListTypeID"] == 0) 
     { 
      item = new ListItem(row["ListText"].ToString(), string.Format("{0}:{1}", row["ListTypeID"].ToString(), row["ListID"].ToString())); 
      ddl.Items.Add(item); 
     } 
     else 
     { 
      item = new ListItem(row["ListText"].ToString(), string.Format("{0}", row["ListID"].ToString())); 
      ddl.Items.Add(item); 
     } 
    } 
+1

이것은 동일한 작업을 수행하는 LINQ 문보다 명확합니다. –

+0

@Reed - 전적으로 당신과 동의하지 않습니다. LINQ/lambda는 컬렉션을 만들 때 더 표현력이 좋습니다. 이 경우처럼. –

답변

5

청소를 대신 한 줄 람다에 모든 주입식의 비트, 나는 절약 라인 공간을 통해 가독성을 선호 :

ddl.Items.AddRange(ds.Tables[0].Rows.Select(row => 
    { 
     var listText = row["ListText"]; 
     var listTypeId = (byte)row["ListTypeID"]; 
     var listId = row["ListID"]; 

     var format = listTypeId == 0 ? "{0}:{1}" : "{1}"; 
     var itemText = String.Format(format, listTypeID, listId); 

     return new ListItem(listText, itemText); 
    } 
    )); 
+0

좋은 접근 방식. –

3
ddl.Items.AddRange(ds.Tables[0].Rows.Select(row => 
(byte)row["ListTypeID"] == 0 
    ? new ListItem(row["ListText"].ToString(), string.Format("{0}:{1}", row["ListTypeID"].ToString(), row["ListID"].ToString())) 
    : new ListItem(row["ListText"].ToString(), string.Format("{0}", row["ListID"].ToString()))   
)); 

ddl.Items.AddRange(ds.Tables[0].Rows.Select(row => 
(byte)row["ListTypeID"] == 0 
    ? new ListItem(row["ListText"].ToString(), string.Format("{0}:{1}", row["ListTypeID"], row["ListID"])) 
    : new ListItem(row["ListText"].ToString(), string.Format("{0}", row["ListID"]))   
)); 

휴가 foreach 문 :

+0

무슨 엉망 이냐 ... ^^ –

+0

foreach를 선택하도록 변경하는 중 ...이게 얼마나 좋은지 잘 모르겠다 ... –

+0

두 가지 제안에 많은 차이가 보이지 않는다. – Thea

1

somet hing like this

var Items= (from DataRow dr in ds.Tables[0].AsEnumerable() 
     select new { 
     Text=dr.Field<string>("ListText"), 
     Value =dr.Field<byte>("ListTypeID") == 0?string.Format("{0}:{1}", dr.Field<string>("ListTypeID"), dr.Field<string>("ListID")):string.Format("{0}", dr.Field<string>("ListID")) 
    }).ToList(); 

이제는 드롭 다운의 데이터 소스로 항목을 사용할 수 있습니다.

2

순서를 약간 변경하면 제외 된 항목을 추가하여 다음을 달성 할 수 있습니다.

var items = ds.Tables[0].Rows.Select(row => 
    new ListItem(row["ListText"].ToString(), 
       String.Format(
        (Byte)row["ListTypeID"] == 0 ? "{0}:{1}" : "{1}", 
        row["ListTypeID"], row["ListID"]))); 
+0

더 나은. 마지막 ToString()을 삭제하면 더 많은 것을 저장할 수 있습니다. String.Format이이를 처리합니다. –

+0

물론 ... 내가 어떻게 그걸 간과 할 수 있니? –

관련 문제