Ho iniziato a imparare c # e sono confuso dalla seguente funzionalità.
Il seguente codice usa una funzione Algs.Combinations (n, m) per produrre un oggetto IEnumerable che contiene le combinazioni di n oggetti presi da m. La sua implementazione è esattamente come si può trovare nella tabella codici di Rosetta per le combinazioni. Ad esempio, applicando .toList () a Algs.Combinations (2,3) produrrebbe la lista [[0,1], [0,2], [1,2]].
Ora nel ciclo foreach aggiungo ogni int [] a una nuova lista. Inoltre, stampo i valori di ciascun array (ovvero la combinazione) dopo averlo trasformato in un elenco e quindi utilizzando il ForEach integrato. Tutto funziona come previsto.
Nel prossimo blocco io uso il built-in ForEach nella mia nuova lista e sembra che ogni int [] sia diventato [2,2]. Che cosa sta succedendo qui? Presumibilmente nella mia foreach in realtà non sto aggiungendo l'array intero ma una sorta di puntatore?
using System;
using System.Collections.Generic;
using System.Linq;
namespace Examples
{
class main
{
public static IEnumerable<int[]> Combinations(int m, int n)
{
int[] result = new int[m];
Stack<int> stack = new Stack<int>();
stack.Push(0);
while (stack.Count > 0)
{
int index = stack.Count - 1;
int value = stack.Pop();
while (value < n)
{
result[index++] = value++;
stack.Push(value);
if (index == m)
{
yield return result;
break;
}
}
}
}
static void Main(String[] args)
{
var l = Combinations(2, 3);
var newL = new List<int[]>();
foreach (int[] combs in l)
{
newL.Add(combs);
combs.ToList().ForEach(p => Console.Write(p + " ")); // prints 0 1, 0 2, 1 2
Console.WriteLine();
}
newL.ForEach(p =>
{
p.ToList().ForEach(q => Console.Write(q + " ")); // prints 2 2, 2 2, 2 2
Console.WriteLine();
});
}
}
}
Google non ha aiutato finora. Saranno apprezzati tutti i collegamenti alla letteratura che dovrei esaminare.