using System.Collections.Generic;
using System.Threading.Tasks;
VariantsRanks = new List<VariantsRank>();
public int TestId { get; set; }
public List<VariantsRank> VariantsRanks { get; set; }
public class VariantsRank
public int VariantId { get; set; }
public string Name { get; set; }
public int Rank { get; set; }
public bool Selected { get; set; }
public static void Main()
List1.VariantsRanks.Add(new VariantsRank { VariantId = 222, Name = "Cp1", Rank = 0, Selected = false });
List1.VariantsRanks.Add(new VariantsRank { VariantId = 223, Name = "Cp2", Rank = 1, Selected = false });
List1.VariantsRanks.Add(new VariantsRank { VariantId = 224, Name = "Cp3", Rank = 2, Selected = false });
List1.VariantsRanks.Add(new VariantsRank { VariantId = 225, Name = "Cp4", Rank = 3, Selected = false });
List1.VariantsRanks.Add(new VariantsRank { VariantId = 226, Name = "Cp5", Rank = 4, Selected = false });
List2.VariantsRanks.Add(new VariantsRank { VariantId = 223, Name = "Cp2", Rank = 0, Selected = true });
List2.VariantsRanks.Add(new VariantsRank { VariantId = 225, Name = "Cp4", Rank = 1, Selected = true });
var matchQueue = new Queue<VariantsRank>(
from r2 in List2.VariantsRanks
join r1 in List1.VariantsRanks on r2.VariantId equals r1.VariantId
var matchSet = new HashSet<int>(matchQueue.Select(r2 => r2.VariantId));
var result = List1.VariantsRanks
.Select(r1 => matchSet.Contains(r1.VariantId) ? matchQueue.Dequeue() : r1)
.Concat(List2.VariantsRanks
.Where(r2 => !matchSet.Contains(r2.VariantId))
.Select((r, i) => new VariantsRank { VariantId = r.VariantId, Name = r.Name, Rank = i })
foreach (var res in result)
Console.WriteLine("\t{0} {1} {2}", res.Name, res.Rank, res.Selected);