Simply use Concat
then OrderBy
var resultList = list1.Concat(list2).OrderBy(x => x.Something).ToList();
UPDATE: According to your comments, here is an extension method that you can use.Since you don't tell us how your class look like, I just create a class an interface for example.
public static IEnumerable<T> ConcatItems<T>(this IList<T> source, IList<T> dest)
where T: ISequence
{
int index = 0;
foreach (var x in source)
{
if (x.SequenceNumber < dest[index].SequenceNumber)
{
dest.Insert(index, x);
continue;
}
while(x.SequenceNumber > dest[index].SequenceNumber) index++;
if (index != dest.Count - 1 && x.SequenceNumber == dest[index].SequenceNumber)
{
while (index != dest.Count -1 &&
Math.Abs(dest[index].SequenceNumber - dest[index + 1].SequenceNumber) == 1) index++;
if (index != dest.Count - 1) dest.Insert(index, x);
else dest.Add(x);
continue;
}
dest.Insert(index, x);
}
return dest;
}
Interface and Class:
public interface ISequence
{
int SequenceNumber { get; set; }
}
class Item : ISequence
{
public int SequenceNumber { get; set; }
public Item(int number)
{
SequenceNumber = number;
}
}
Here is the usage (list1
and list2
are List<Item>
):
var result = list1.ConcatItems(list2);
The method is working exactly what you want but you should implement it according to your situation and that part is up to you...
Here is a demonstration on LINQPad
:
List1:
List2:
Output:
Last note: This method assumes your items are ordered.If they are not, first sort your items then call the method:
Comparison<Item> comp = (x, y) => x.SequenceNumber.CompareTo(y.SequenceNumber);
list1.Sort(comp);
list2.Sort(comp);
var result = list1.ConcatItems(list2);