Zawsze obowiązuje obowiązkowa implementacja LINQ. Najprawdopodobniej śmieci, ale od kiedy wydajność przeszkadza w korzystaniu z nowych, fajnych funkcji?
var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
var sequence = from one in letters
from two in letters
from three in letters
from four in letters
orderby one, two, three, four
select new string(new[] { one, two, three, four });
"Sekwencja" będzie teraz wersją IQueryable zawierającą AAAA do ZZZZ.
Edit:
Ok, więc to był podsłuch mi, że powinno być możliwe, aby sekwencję długości konfigurowalnego z konfigurowalnym alfabetu przy użyciu LINQ. Więc oto jest. Znowu kompletnie bez sensu, ale mnie to dręczyło.
public void Nonsense()
{
var letters = new[]{"A","B","C","D","E","F",
"G","H","I","J","K","L",
"M","N","O","P","Q","R","S",
"T","U","V","W","X","Y","Z"};
foreach (var val in Sequence(letters, 4))
Console.WriteLine(val);
}
private IQueryable<string> Sequence(string[] alphabet, int size)
{
// create the first level
var sequence = alphabet.AsQueryable();
// add each subsequent level
for (var i = 1; i < size; i++)
sequence = AddLevel(sequence, alphabet);
return from value in sequence
orderby value
select value;
}
private IQueryable<string> AddLevel(IQueryable<string> current, string[] characters)
{
return from one in current
from character in characters
select one + character;
}
Wywołanie metody Sequence daje ten sam AAAA do listy ZZZZ jak wcześniej, ale teraz można zmienić słownik używany i jak długo będzie produkowane słowa.
Co chcesz zrobić? Może być lepiej generować listę leniwie, w zależności od twojej odpowiedzi. –
@John the Statistician: Używanie bloków iteratora * nie * generuje listy leniwie. –
Może to być przydatne podczas tworzenia naiwnej, brutalnej logiki. Zrobiłem coś podobnego do klasy, kiedyś, kiedy musieliśmy złamać szyfr. Technika analityczna była łatwa, więc napisałem program, który wykorzystywał całe laboratorium komputerowe w college'u przez kilka godzin przed sobotnim porankiem. :) –