2011-07-20 36 views
0

更換循環會是什麼在LINQ(C#),相當於這些代碼示例:C#與LINQ

int[] items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

int number = -1; 
foreach (int i in items) 
{ 
    if (i == 5) 
    { 
     number = i; 
     break; 
    } 
} 

你怎麼會在LINQ兩個(或更多)的條件下更換一個循環? (它類似於上面的代碼,不能拿出一個更好的例子。試想一下,其他條件或支票發生有在for循環)

int[] items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

int number = -1; 

for (int i = 0; i < items.Length && number == -1; i++) 
{ 
    if (items[i] == 5) 
     number = items[i]; 
} 

而第三個代碼,如何這將被翻譯成LINQ:

List<int> items2 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

int i = items2.Count - 1; 

for (; i > 0; i--) 
    items2.RemoveAt(i); 

在此先感謝。

+0

最後一個看起來像'items2.Clear();'給我。 – CodesInChaos

回答

9

前兩個是很奇怪的,但他們基本上是有效的:

int number = items.Contains(5) ? 5 : -1; 

int number = items.Any(x => x == 5) ? 5 : -1; 

這樣做的另一種方法:如果你能

int number = items.Where(x => x == 5).DefaultIfEmpty(-1).First(); 

想出更現實的操作,我們可以拿出更多明智的LINQ查詢:)

第三個片段不能真正轉換成LINQ,因爲它不是查詢 - 它的變異了的列表。

+0

這個如何: private T FindLargestKey() if(this.Count == 0)return default(T); T largestKey = this [0]; foreach(T key in this.List) if(KeyLarger(key))largestKey = key; } return largestKey; } – juFo

+0

那麼列表的增長或縮小將無法與LINQ一起使用? – juFo

+0

@juFo:你通常不會用LINQ進行修改 - 你用新的序列創建一個新的列表(或其他)。至於你的FindLargestKey,聽起來像'sequence.DefaultIfEmpty()。Max()'。 –

2

正如喬恩指出的,最後一個不能轉換爲LINQ。但是,它可以簡化爲:

var survivers = 1; 
items2.RemoveRange(survivers , items2.Count - survivers); 
+1

以及最後一件物品存活(或如果你改變它,最後2或3件物品存活)。 (請參閱i> 0或更改0到4)所以清除不正確。 – juFo

+0

@juFo:對,你說得對。固定。 –

+0

感謝您使用RemoveRange指出我,忘記了它。 – juFo