什麼是基於LINQ的函數,它將滿足謂詞的所有項放在序列的前面,如C++的std::partition
?LINQ相當於std ::分區
1
A
回答
4
如果我理解你想達到什麼樣的,一個簡單的解決方案將是OrderByDescending
:
IEnumerable<T> Partition<T>(IEnumerable<T> s, Func<T, bool> predicate)
{
return s.OrderByDescending(predicate);
}
這工作,因爲bool
實現IComparable<bool>
與false
來臨前true
。因此predicate
評估爲true
的項目將首先放置在結果集中。
這裏是一個手工製作的實現,以防萬一您感興趣。我沒有做任何基準測試,但這個測試可能會更快。
IEnumerable<T> Partition<T>(IEnumerable<T> s, Func<T, bool> predicate)
{
List<T> falses = new List<T>();
foreach(var t in s)
{
if (predicate(t))
{
yield return t;
}
else
{
falses.Add(t);
}
}
foreach (var t in falses)
{
yield return t;
}
}
1:手工製作的解決方案是O(Ñ),但OrderBy
被認爲是O(Ñ日誌Ñ)。但是,根據OrderBy
方法的實施細節,它們可能執行幾乎完全相同。
0
我最好的拍攝:
IEnumerable<T> Partition<T>(IEnumerable<T> s, Func<T, bool> predicate)
{
var split = s.GroupBy(predicate);
return split
.Where(kv => kv.Key)
.Single()
.Concat(split
.Where(kv => !kv.Key)
.Single());
}
0
使用SelectMany
,您可以改善自己的答案:
IEnumerable<T> Partition<T>(IEnumerable<T> s, Func<T, bool> predicate)
{
return s.GroupBy(predicate).SelectMany(xs => xs);
}
+0
這將組合這些項目,但它不會以任何保證順序返回組 - 如果第一項評估爲true,它將返回所有true的第一個,如果它評估爲false,它將返回所有false的第一。你仍然需要某種'OrderBy'。 –
+0
@ p.s.w.g謝謝。那麼,這只是你的一個複雜版本。 – Lumen
相關問題
- 1. Linq相當於
- 2. LINQ相當於Rails
- 3. std :: once_flag相當於BOOST_ONCE_INIT
- 4. 相當於std :: set嗎?
- 5. std :: lock()相當於boost :: shared_mutex?
- 6. Qt std :: runtime_error相當於
- 7. python相當於clojure的分區 - 所有?
- 8. 關係代數分區sql相當於
- 9. Linq與Lambda相當於SQL
- 10. TSQL相當於Linq SelectMany
- 11. 那2個linq相當於?
- 12. 相當於LINQ查詢
- 13. LINQ相當於此查詢
- 14. 需要的LINQ相當於
- 15. 在Linq的ISNULL相當於
- 16. std :: make_heap在Java中相當於?
- 17. 這相當於一個std :: string嗎?
- 18. 相當於C++的std ::在Matlab
- 19. C#相當於C++ std :: string find_first_not_of和find_last_not_of
- 20. LINQ相當於一個T-SQL查詢
- 21. Hive相當於從當前分區日期獲取數據
- 22. 在Scala中的LINQ SelectMany相當於
- 23. 的LINQ to XML相當於XPath的
- 24. 相當於SQL查詢中使用LINQ
- 25. LINQ相當於一個連接查詢;
- 26. 的LINQ相當於SQL LIKE [A-F]
- 27. Linq的「SELECT SYSTEM_USER」相當於什麼
- 28. 相當於Python的LINQ所有函數?
- 29. 什麼是LINQ相當於SQL
- 30. LINQ表達式相當於TSQL查詢
一個次要的事情是,由馬特·克萊恩提供的嘗試評估熱切而'OrderByDescending'將推遲。我肯定會贊成'OrderByDescending'解決方案,但只要馬特知道與他的實現有所不同就可以了。 –