試試這個(不重複使用LINQ的內置的方法(倒帶迭代器)已知的),剛剛重新使用OP的邏輯(我相信是高性能的,它不會在下次重新評估條件名單的一半),並在一個整潔的擴展方法包裝它,元組:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Craft
{
class Act
{
static void Main(string[] args)
{
var a = new List<string>
{ "I", "Love", "You", "More", "Today", "Than", "Yesterday" };
var tx = a.SplitByCondition(s => s == "More");
foreach (var s in tx.Item1)
Console.WriteLine("First Half : {0}", s);
foreach (var s in tx.Item2)
Console.WriteLine("Second Half : {0}", s);
Console.ReadLine();
}
}//Act
public static class Helper
{
public static Tuple<List<T>, List<T>> SplitByCondition<T>
(this IEnumerable<T> t, Func<T, bool> terminator)
{
var tx = new Tuple<List<T>, List<T>>
(new List<T>(), new List<T>());
var iter = t.GetEnumerator();
while (iter.MoveNext())
{
if (terminator(iter.Current))
{
tx.Item2.Add(iter.Current);
break;
}
tx.Item1.Add(iter.Current);
}
while (iter.MoveNext())
tx.Item2.Add(iter.Current);
return tx;
}
}//Helper
}//Craft
輸出:
First Half : I
First Half : Love
First Half : You
Second Half : More
Second Half : Today
Second Half : Than
Second Half : Yesterday
我理解你的代碼,但如果'(e.Current)'沒有意義。我認爲你正在尋找存儲最後一次MoveNext調用的值(從第一個循環開始),並檢查它是否成功。 – Ani 2011-01-06 01:24:56
經過更新以使其更有意義(即,一旦CheckCondition爲true,則將「e.Current」添加到'b',而不是在循環外處理該項目。 – Anonym 2011-01-06 01:47:51
是的,現在很清楚。 – Ani 2011-01-06 01:59:01