2017-02-22 2 views
1

Ниже мои модели:Получение неуместное ранга во время объединения и организации 2 списка

public class Test 
{ 
    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; } 
} 

Я существующий Test экземпляр, который содержит следующие значения для VariantsRanks

VariantId = 10, Name = "V1", Rank = 0 
VariantId = 11, Name = "V2", Rank = 1 

Я тогда необходимо слить после VariantsRank

VariantId = 12, Name = "V3", Rank = 0 
VariantId = 13, Name = "V4", Rank = 1 

и увеличиваем Rank производить следующие выходные данные

VariantId = 10, Name = "V1", Rank = 0 
VariantId = 11, Name = "V2", Rank = 1 
VariantId = 12, Name = "V3", Rank = 2 
VariantId = 13, Name = "V4", Rank = 3 

и я использую следующий код, который работает правильно (List1 является первоначальный список, и List2 список должны быть объединены)

int highestOrder = (List1.VariantsRanks.Max(cpo => cpo.Rank)) + 1; 
foreach (var rank in List2.VariantsRanks) 
{ 
    var match = List1.VariantsRanks.FirstOrDefault(x => x.VariantId == rank.VariantId); 
    if (match != null) // found 
    { 
     match.Rank = rank.Rank; 
    } 
    else 
    { 
     rank.Rank = highestOrder; 
     highestOrder = highestOrder + 1; 
     List1.VariantsRanks.Add(rank); 
    } 
} 

I затем необходимо объединить следующие VariantsRank в новый список (обратите внимание на соответствующие значения VariantId, но они находятся в обратном порядке)

VariantId = 13, Name = "V4", Rank = 0 
VariantId = 12, Name = "V3", Rank = 1 

, так что выход должен быть

VariantId = 10, Name = "V1", Rank = 0 
VariantId = 11, Name = "V2", Rank = 1 
VariantId = 13, Name = "V4", Rank = 2 
VariantId = 12, Name = "V3", Rank = 3 

однако приведенный выше код вместо выводит

VariantId = 10, Name = "V1", Rank = 0 
VariantId = 11, Name = "V2", Rank = 1 
VariantId = 12, Name = "V3", Rank = 1 
VariantId = 13, Name = "V4", Rank = 0 

и Rank значения не увеличивается правильно

Как изменить код, чтобы убедиться, что дубликат VariantId не добавляются, но увеличиваются Rank?

+0

В коде должен быть вопрос, а не ссылка на скрипку. –

+0

@StephenMuecke: На самом деле это увеличило бы длину моего вопроса и причину для того, чтобы дать скрипку, поскольку вам было бы легко непосредственно увидеть результат и непосредственно работайте с кодом, как указано Enigmativity before.Long вопрос не получает внимания –

+0

Сократите свой существующий код до 2 элементов в списке и покажите код, в котором вы манипулируете списком - вот что важно (и скрипка даже не работает - его тайм-аут) –

ответ

1

Вы делаете то, что в 2 слиянии добавляете элементы со значениями, соответствующими VariantId в существующем списке. Это означает, что вы нажимаете код в блоке if, который сбрасывает значения существующих элементов на значение Rank в модели вашей публикации.

Например, в первой итерации цикла вашего, match является существующим элементом с VariantID = 13 и вашим установить его равный Rank значение rank.Rank которое 0.

Вы должны сначала удалить любые совпадения из существующего списка, а затем перебрать опубликованные значения, обновить их Rank и добавить в коллекцию.

Вы код должен быть

// Get the VariantId values of the list to be merged 
var ids = List2.VariantsRanks.Select(x => x.VariantId); 
// Remove any matches from the existing list 
List1.VariantsRanks.RemoveAll(x => ids.Contains(x.VariantId)); 
// Calculate the current highest rank 
int highestOrder = (List1.VariantsRanks.Max(x => x.Rank)); 
foreach (var rank in List2.VariantsRanks) 
{ 
    // Update the rank 
    rank.Rank = ++highestOrder; // pre-increment 
    // Add to the existing list 
    List1.VariantsRanks.Add(rank); 
} 

На основе замечаний в чате, что второй список может содержать элементы, которые должны быть вставлены в середине первого списка, то код нужно будет быть

// Get the VariantId's of the first and last items in the list to be merged 
var firstID = List2.VariantsRanks.First().VariantId; 
var lastID = List2.VariantsRanks.Last().VariantId; 
// Get the indexers of those items in the original list 
var firstIndex = List1.VariantsRanks.FindIndex(x => x.VariantId == firstID); 
var lastIndex = List1.VariantsRanks.FindIndex(x => x.VariantId == lastID); 
if (firstIndex > lastIndex) // in case they are in descending order 
{ 
    var temp = lastIndex; 
    lastIndex = firstIndex; 
    firstIndex = temp; 
} 
// Remove matches from the original list 
for (int i = firstIndex; i < lastIndex + 1; i++) 
{ 
    List1.VariantsRanks.RemoveAt(firstIndex); 
} 
// Inset the items from the list to be merged 
for(int i = 0; i < List2.VariantsRanks.Count; i++) 
{ 
    List1.VariantsRanks.Insert(firstIndex + i, List2.VariantsRanks[i]); 
} 
/Re-number the Rank 
for(int i = 0; i < List1.VariantsRanks.Count; i++) 
{ 
    List1.VariantsRanks[i].Rank = i; 
} 

Обратите внимание, выше будет работать только в том случае, если значения VariantId в объединенном списке подряд (в порядке возрастания или убывания)

Смежные вопросы