Bạn có thể xác định phương thức tiện ích mở rộng cho việc này. Một cái gì đó như
public static IEnumerable<T> MergeSorted<T>(this IEnumerable<T> first, IEnumerable<T> second, Func<T, T, int> comparer)
{
using (var firstEnumerator = first.GetEnumerator())
using (var secondEnumerator = second.GetEnumerator())
{
var elementsLeftInFirst = firstEnumerator.MoveNext();
var elementsLeftInSecond = secondEnumerator.MoveNext();
while (elementsLeftInFirst || elementsLeftInSecond)
{
if (!elementsLeftInFirst)
{
do
{
yield return secondEnumerator.Current;
} while (secondEnumerator.MoveNext());
yield break;
}
if (!elementsLeftInSecond)
{
do
{
yield return firstEnumerator.Current;
} while (firstEnumerator.MoveNext());
yield break;
}
if (comparer(firstEnumerator.Current, secondEnumerator.Current) < 0)
{
yield return firstEnumerator.Current;
elementsLeftInFirst = firstEnumerator.MoveNext();
}
else
{
yield return secondEnumerator.Current;
elementsLeftInSecond = secondEnumerator.MoveNext();
}
}
}
}
Cách sử dụng:
var s1 = new[] { 1, 3, 5, 7, 9 };
var s2 = new[] { 2, 4, 6, 6, 6, 8 };
var merged = s1.MergeSorted(s2, (a, b) => a > b ? 1 : -1).ToList();
Console.WriteLine(string.Join(", ", merged));
Output:
1, 2, 3, 4, 5, 6, 6, 6, 7, 8, 9
Nguồn
2012-03-21 17:07:12
thể trùng lặp của [thuật toán hiệu quả nhất cho việc sáp nhập được sắp xếp IEnumerable] (http://stackoverflow.com/questions/ 2767007/hiệu quả nhất-thuật toán-cho-hợp nhất-sắp xếp-ienumerablet) –
Jon
Bạn đã trích xuất thuật toán thủ công của mình thành một phương pháp riêng biệt? Đó sẽ là cách đơn giản nhất để cải thiện khả năng đọc. – phoog
Nếu bạn thích khả năng đọc (trên hiệu suất) thì: 'var both = first.Union (thứ hai) .OrderBy (so sánh);' –