C # Как заменить объекты в одной коллекции на объекты из другой коллекции - PullRequest
2 голосов
/ 29 ноября 2011

Как заменить объекты в Collection1 на соответствующий объект (по имени и описанию) из Collection2?

Также объекты для операции сопоставления в Collection2 должны находиться в определенном диапазоне, скажем, от 0 до 20. Объекты с индексом> 20 в Collection2 должны быть добавлены в Collection1.

Ответы [ 4 ]

3 голосов
/ 29 ноября 2011
    List<MyClass> mainList = new List<MyClass>();
    List<MyClass> childList = new List<MyClass>();

    foreach (MyClass myClass in childList)
    {
        int index = mainList.FindIndex(delegate(MyClass item) { return    (item.Name==myClass.Name && ; item.Description == myClass.Description);});
        mainList[index] = myClass;
    }

Попробуйте это.Я надеюсь, что вы получите желаемый результат.

2 голосов
/ 29 ноября 2011

Это один из способов:

foreach (var item in collection2.Take(20)) // grab replacement range
{
    int index;
    if ((index = collection1.FindIndex(x => 
                                  x.Name == item.Name && 
                                  x.Description == item.Description)) > -1)
    {
        collection1[index] = item;
    }
}
collection1.AddRange(collection2.Skip(20)); // append the rest

Весьма вероятно, что код можно улучшить еще больше, если бы ваши намерения были немного более ясными.Там может быть более чистый способ, если проблема была лучше понята.

2 голосов
/ 29 ноября 2011
List<MyClass> originalCollection = new List<MyClass>();
List<MyClass> newStuff = new List<MyClass>();

foreach (var item in newStuff)
{
    int index = originalCollection.FindIndex(x => x.Name == item.Name && x.Description == item.Description);

    if (index < 0)
        continue;

    originalCollection[index] = item;
}

Если вы действительно хотите 1-лайнер ...

List<MyClass> originalCollection = new List<MyClass>();
List<MyClass> newStuff = new List<MyClass>();

originalCollection = newStuff.Concat(originalCollection.Where(x => !newStuff.Any(y => y.Description == x.Description && y.Name == x.Name)).ToArray()).ToList();
1 голос
/ 29 ноября 2011

в одну сторону в методе продления

public static void Replace(this object[] elements, object oldObject, object newObject) {
var index = elements.IndexOf(oldObject);

if (index > 0) {
 elements[index] = newObject;
}}
...