Подход для изменения порядка следования, начиная с середины, где есть дубликаты - PullRequest
0 голосов
/ 27 мая 2020

Имейте список простых объектов, у которых есть свойство "TruckNumber". В большинстве случаев они расположены в порядке возрастания, например. 1, 2, 3,4, 8, 11

Иногда проблема заключается в том, что система, из которой я получаю данные, идентифицирует более одного объекта с одним и тем же номером TruckNumber. например. 1, 2, 3, 3, 3 , 4, 5, 6, 7, 8, 9

Мне нужен способ преобразовать этот список в этот 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11

Неизвестно, но я думаю, что мне также нужно обработать условие, когда существует несколько «наборов» повторяющихся TruckNumber. ценности. например. 1, 2, 3, 3, 3 , 4, 5, 6, 7, 7, 7, 8, 9 которые станут 1,2,4,5,6, 7, 8, 9, 10, 11, 12, 13

Однако в приведенных выше примерах объекты с номерами TruckNumbers 1, 2 должны оставаться в таком порядке, как и 8,9

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Если я правильно понял, вы можете сделать это:

static IEnumerable<int> WithoutDuplicates(this IEnumerable<int> source)
{
    int sourceCount = source.Count();
    var distinct = source.OrderBy(i => i).Distinct();
    int distinctCount = distinct.Count();

    if (distinctCount == count)
    {
        return distinct;
    }

    // If items have been removed, append replacements
    int next = distinct.Max() + 1;
    int difference = sourceCount - distinctCount;
    return distinct.Union(Enumerable.Range(next, difference));
}

Тогда:

var source = new [] { 1, 2, 3, 3, 3, 4, 5, 6, 7, 7, 7, 8, 9 };
source.WithoutDuplicates(); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
0 голосов
/ 27 мая 2020

Вы можете использовать overload of Select, который принимает индекс элемента:

class Truck { public int TruckNumber { get; set; } }

static void Main(string[] args)
{
    Truck[] trucks =
    {
        new Truck { TruckNumber = 1 }, new Truck { TruckNumber = 2 },
        new Truck { TruckNumber = 3 }, new Truck { TruckNumber = 3 }, new Truck { TruckNumber = 3 },
        new Truck { TruckNumber = 4 }, new Truck { TruckNumber = 5 }, new Truck { TruckNumber = 6 },
        new Truck { TruckNumber = 7 }, new Truck { TruckNumber = 8 }, new Truck { TruckNumber = 9 }
    };                                                                            
    var trucks2 = trucks.Select((tn, index) => { tn.TruckNumber = index + 1; return tn; });
}
0 голосов
/ 27 мая 2020

Я думаю, это будет делать то, что вы хотите, хотя это не очень эффективно. Использование SortedDictionary может быть более оптимизировано.

var startingList = new []
{
   new Thing { TruckNumber = 1 },   
   new Thing { TruckNumber = 2 },
   new Thing { TruckNumber = 2 },
   new Thing { TruckNumber = 3 },
   new Thing { TruckNumber = 4 },
   new Thing { TruckNumber = 5 },
   new Thing { TruckNumber = 5 },
   new Thing { TruckNumber = 6 },
   new Thing { TruckNumber = 7 }
}

var cleanedList = new List<Thing>();

var duplicates = new List<Thing>();

foreach (var thing in startingList) 
{
    if (cleanedList.Any(t => t.TruckNumber == thing.TruckNumber)) 
    {
        duplicates.Add(thing);
    }
    else 
    {
        cleanedList.Add(thing);
    }
}

var lastTruckNumber = cleanedList.Select(t => t.TruckNumber).Max();

foreach (var thing in duplicates) 
{
    var nextTruckNumber = lastTruckNumber + 1;
    thing.TruckNumber = nextTruckNumber;
    lastTruckNumber = nextTruckNumber;
}

return cleanedList;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...