如何像
var (odds,evens) = (collection.Where(a=> a % 2 == 1), collection.Where(a=> a % 2 == 0));?
,或者如果你要分區基於一個條件
Func<int,bool> predicate = a => a%2==0;
var (odds,evens) = (collection.Where(a=> !predicate(a)), collection.Where(a=> predicate(a)));
我覺得沒有圍繞着你迭代兩次的項目這樣的事實工作,還有什麼可以做的是有一個方法接受一個謂詞並傳入2個sepatate集合,並在foreach或for循環中填充它們。
事情是這樣的:
var collection = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9};
Func<int,bool> predicate = a => a%2==0;
var odds = new List<int>();
var evens = new List<int>();
Action<List<int>, List<int>, Func<int, bool>> partition = (collection1, collection2, pred) =>
{
foreach (int element in collection)
{
if (pred(element))
{
collection1.Add(element);
}
else
{
collection2.Add(element);
}
}
};
partition(evens, odds, predicate);
上的最後一個想法擴展,你在尋找這樣的事情?
public static (ObservableCollection<T>, ObservableCollection<T>) Partition<T>(this ObservableCollection<T> collection, Func<T, bool> predicate)
{
var collection1 = new ObservableCollection<T>();
var collection2 = new ObservableCollection<T>();
foreach (T element in collection)
{
if (predicate(element))
{
collection1.Add(element);
}
else
{
collection2.Add(element);
}
}
return (collection1, collection2);
}
可以隨時拉在F#庫,並使用它從C# –
展望在F#源代碼中,它看起來實際上只是將兩個過濾器應用於源流,因此它與我的兩個'wheres'提議基本相同。 – spencercw