我有几个巨大的已排序的可枚举序列,我想合并.这些列表被操作为IEnumerable但已经排序.由于输入列表已排序,因此应该可以在一次行程中合并它们,而无需重新排序任何内容.
我想保留deferred执行行为.
我试着编写一个天真的算法来做到这一点(见下文).但是,它看起来很丑陋,我确信它可以进行优化.它可能存在更多的学术算法......
IEnumerable<T> MergeOrderedLists<T, TOrder>(IEnumerable<IEnumerable<T>> orderedlists,
Func<T, TOrder> orderBy)
{
var enumerators = orderedlists.ToDictionary(l => l.GetEnumerator(), l => default(T));
IEnumerator<T> tag = null;
var firstRun = true;
while (true)
{
var toRemove = new List<IEnumerator<T>>();
var toAdd = new List<KeyValuePair<IEnumerator<T>, T>>();
foreach (var pair in enumerators.Where(pair => firstRun || tag == pair.Key))
{
if (pair.Key.MoveNext())
toAdd.Add(pair);
else
toRemove.Add(pair.Key);
}
foreach (var enumerator in toRemove)
enumerators.Remove(enumerator);
foreach (var pair in toAdd)
enumerators[pair.Key] = pair.Key.Current; …Run Code Online (Sandbox Code Playgroud) 有没有办法合并(没有欺骗的联合)两个给定的列表,并使用ONE for循环以排序的方式存储项目?
另外,我正在寻找一种不使用API方法的解决方案(例如,union,sort等).
示例代码.
private static void MergeAndOrder()
{
var listOne = new List<int> {3, 4, 1, 2, 7, 6, 9, 11};
var listTwo = new List<int> {1, 7, 8, 3, 5, 10, 15, 12};
//Without Using C# helper methods...
//ToDo.............................
//Using C# APi.
var expectedResult = listOne.Union(listTwo).ToList();
expectedResult.Sort();//Output: 1,2,3,4,5,6,7,8,9,10,11,12,15
//I need the same result without using API methods, and that too by iterating over items only once.
}
Run Code Online (Sandbox Code Playgroud)
PS:我在接受采访时被问过这个问题,但还没有找到答案.
我编写这个函数来合并两个数组.
private static int[] Merge(int[] array1, int[] array2)
{
var mergedArray = new int[array1.Length + array2.Length];
int i = 0, j = 0, k = 0;
while(k < mergedArray.Length)
{
if(i == array1.Length || j == array2.Length)
{
if (i <= j)
{
mergedArray[k] = array1[i];
i++;
}
else
{
mergedArray[k] = array2[j];
j++;
}
}
else
{
if(array1[i] < array2[j])
{
mergedArray[k] = array1[i];
i++;
}
else
{
mergedArray[k] = array2[j];
j++;
}
}
k++;
}
return mergedArray;
} …Run Code Online (Sandbox Code Playgroud)