[C#] generyczny Swap

0

o to bohater, generyczny Swap :)

public void Swap<T>(ref T e1, ref T e2)
    {
        var temp = e1;
        e1 = e2;
        e2 = temp;
    }

a to kawałek kodu którego taki Swap nie potrafi zrealizować

var list = new List<int>(); // powiedzmy ze jest juz uzupełniona jakimiś np. liczbami :)

...

for(var i = 1; i < list.Count; ++i)
    Swap(ref list[i - 1], ref list[i]);

jeśli ktoś byłby tak miły wyjaśnić mi dlaczego to coś nie chce takiej rzeczy realizować to byłbym bardzo wdzięczny, bo wujek Google milczy i ciocia MSDN też ;P

twierdzi, że argumenty funkcji są nieprawidłowe :/ bo zwykłe zmienne nie takie przez indexer z listy to ładnie zamienia...

dziwna sprawa dla mnie przynajmniej, chyba że dzieje sie coś dziwnego wtedy gdy jest to referencja do elemetu z listy....

0

Odpowiedź chyba jest oczywista, VS jasno podpowiada:

A property or indexer may not be passed as an out or ref parameter

0

Jeśli używasz .NET3.5, to możesz wykorzystać Extension Methods:

    public static class ExtensionMethods
    {
        public static void Swap<T>(this List<T> list, int index1, int index2)
        {
            T tmp = list[index1];
            list[index1] = list[index2];
            list[index2] = tmp;
        }
    }

    static class Program
    {
        [STAThread]
        static void Main(String[] args)
        {
            List<int> list = new List<int>(new int[] { 1, 2, 3, 4, 5 });
            list.ForEach(delegate(int item) { Console.Write(item + ", "); });
            Console.WriteLine();
            list.Swap(1, 4);
            list.ForEach(delegate(int item) { Console.Write(item + ", "); });
            Console.WriteLine();
        }
    }

Jak widzimy - metoda Swap jest wywoływana jak wewnętrzna metoda klasy List<T>.
Jeśli używasz niższych wersji, to musisz stworzyć w dodatkową metodę dla list, która będzie przyjmować listę i dwa indeksy.

0

Okej...

a może w takim razie ktoś wie jako to jakoś obejść?
bo taki Swap co list np. nie może zamieniać to już normalnie lipa :/

bardzo mnie ciekawi dlaczego takie dali ograniczenie :/

Extension Methods ---> łaaał xD

1 użytkowników online, w tym zalogowanych: 0, gości: 1