{1,2,3,1,2,1,5,1,2,1,1}
整數的名單,我喜歡檢索位於前5名全部爲1。我需要跳過5後的所有其他項目。結束列表將是
{1,1,1}
我怎樣才能做到這一點使用linq?
{1,2,3,1,2,1,5,1,2,1,1}
整數的名單,我喜歡檢索位於前5名全部爲1。我需要跳過5後的所有其他項目。結束列表將是
{1,1,1}
我怎樣才能做到這一點使用linq?
嘗試這種情況:
using System.Linq;
class Program
{
static void Main()
{
var list
= new[] { 1, 2, 3, 1, 2, 1, 5, 1, 2, 1, 1 };
var filteredList
= list.TakeWhile(i => i != 5)
.Where(j => j == 1);
}
}
的TakeWhile
方法產生從原始序列的所有元素,直到一個元件出現故障的謂詞。所以在這種情況下,我們得到list
中的所有數字,直到達到等於5的數字爲止。
一旦我們完成了這一步,我們可以使用Where
簡單地將結果序列過濾到1。
示例顯示了Andrew Hare的解決方案和Saeed的解決方案之間的差異。
class Program
{
public static IEnumerable<int> TestData()
{
while (true)
yield return 5;
}
public static IEnumerable<int> AndrewHare(IEnumerable<int> xs)
{
return xs.TakeWhile(i => i != 5)
.Where(j => j == 1);
}
public static IEnumerable<int> Saeed(IEnumerable<int> xs)
{
bool find5 = false;
return xs.Where(p => p == 1 && !(find5 = (p == 5) ? true : find5));
}
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Restart();
for (int i = 0; i < 1000000; i++)
{
foreach (var x in AndrewHare(TestData())) ;
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
watch.Restart();
for (int i = 0; i < 1000000; i++)
{
foreach (var x in Saeed(TestData())) ;
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
Console.ReadKey();
}
}
我不明白你爲什麼在這裏提供這個,爲什麼你通過粘貼我的代碼複製upvote。我沒有,這就像兩個人在這裏的友誼關係。 – 2010-12-09 10:36:50
非常感謝你 – ratty 2010-12-08 06:56:50