2015-10-05 60 views
2

如何將以下foreach循環轉換爲linq等效項? 也foreach循環或linq表現更好?這裏的物品數量是有限的,可能在100秒內。提前致謝。將foreach循環轉換爲Linq表達式

ObservableCollection<ListItem> _ListItems = null; 
string[] listItems = ListValueString.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); 

foreach (var lstItem in listItems) 
{ 
    var itm = new ListItem(); 
    string[] listTexts = lstItem.Split(':'); 

    itm.ListText = listTexts[0]; 
    itm.ListId = Int32.Parse(listTexts[1]); 
    itm.IsActive = true; 

    if (_defaultString == Int32.Parse(listTexts[1])) 
    { 
     itm.IsInUse = true; 
    } 
    _ListItems.Add(itm); 
} 
+1

就我個人而言,我不會試圖將這個foreach轉換爲linq表達式,它會讓我很難閱讀。 (糾正我,如果我錯了) – Jannik

+0

命名或類型的問題:'_defaultString == Int32.Parse(listTexts [1])' –

+0

爲了可讀性,請將現有for循環的主體歸入其自己的函數,例如作爲'靜態ListItem轉換(字符串lstItem)',然後可以適當地在LINQ'Select'中使用。 –

回答

1

您可以使用此查詢使用匿名類型來存儲中間結果:

List<ListItem> items = ListValueString.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(lstItem => new { lstItem, listTexts = lstItem.Split(':') }) 
    .Select(x => new ListItem() 
    { 
     ListText = x.listTexts[0], 
     ListId = Int32.Parse(x.listTexts[1]), 
     IsActive = true, 
     IsInUse = Int32.Parse(x.listTexts[1]) == _defaultString 
    }) 
    .ToList(); 
var _ListItems = new ObservableCollection<ListItem>(items); 

LINQ還使用循環因此會出現沒有明顯的性能差異。