Как переименовать данные с помощью Linq в зависимости от расположения элементов? - PullRequest
4 голосов
/ 04 февраля 2011

Если у меня есть коллекция Effect, это IEnumerable<Effect>, как мне установить их свойство .Name в зависимости от их расположения в коллекции?

Итак, в конце я просто хочу, чтобы они были переименованы, начиная с 1 до n.

<inside the collection>
effectInstance1.Name = Effect 1;
effectInstance2.Name = Effect 2;
effectInstance3.Name = Effect 3;
...

Возможно ли это с Linq?

Ответы [ 3 ]

8 голосов
/ 04 февраля 2011

LINQ на самом деле не предназначен для мутации в любом случае ; однако вы можете использовать что-то вроде перегрузки Select, которая включает в себя индекс. Но если честно? Просто зациклите и держите счетчик. Гораздо проще понять, и это имеет значение .

int position = 0;
foreach(var obj in collection) {
    position++;
    obj.Name = "Effect " + position.ToString();
}
1 голос
/ 04 февраля 2011

Это не лучшая вещь для решения с LINQ, но возможно возможно:

class Program
{
    private class Effect
    {
        public string Name { get; set; }
    }

    static void Main(string[] args)
    {
        List<Effect> list = new List<Effect> {new Effect(), new Effect(), new Effect()};

        var newElements = list.Select((element, index) =>
        {
            element.Name = "Effect " + index.ToString();
            return element;
        });


        foreach (var effect in newElements)
        {
            Console.WriteLine(effect.Name);
        }
    }
}

Выходы:

Эффект 0

Эффект 1

Эффект 2

1 голос
/ 04 февраля 2011
var n = 0;
collection.ForEach(x=>x.Name = "Effect {0}".FormatWith(++n));

Это простые методы расширения, которые я нашел в 3.5:

public static void ForEach<T>(this IEnumerable<T> collection, Action<T> lambda)
{
    foreach(var element in collection)
        lambda(element);
}

public static string FormatWith(this string base, params object[] args)
{
    return String.Format(base, args);
}
...