Вот что я сделал
private class VirtualStringBWT : IComparable<VirtualStringBWT>, IEnumerable<char>
{
char[] _sourse;
int _shiftRight;
public VirtualStringBWT(char[] sourse, int shift)
{
if (shift >= sourse.Length)
throw new ArgumentOutOfRangeException("Нельзя сдвигать на число большее или равное количеству символов!");
_sourse = sourse;
_shiftRight = shift;
}
public int CompareTo(VirtualStringBWT other)
{
if (other == null)
throw new NullReferenceException();
IEnumerator<char> thisEnumerator = this.GetEnumerator();
IEnumerator<char> otherEnumerator = other.GetEnumerator();
//строки одинаковой длины
while (thisEnumerator.MoveNext() && otherEnumerator.MoveNext())
{
if (thisEnumerator.Current > otherEnumerator.Current)
return 1;
else if (thisEnumerator.Current < otherEnumerator.Current)
return -1;
}
return 0;
}
public IEnumerator<char> GetEnumerator()
{
int startI = _sourse.Length - _shiftRight;
int i = startI;
while (i < _sourse.Length)
{
yield return _sourse[i];
i++;
}
i = 0;
while (i < startI)
{
yield return _sourse[i];
i++;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
1) Из строки которую нужно закодировать я делаю массив символов, который будет один для всех VirtualString.
2) Затем создаю n штук VirtualString куда передаю массив символов и сдвиг.
for (int i = 0; i < _source.Length; i++)
list.Add(new VirtualStringBWT(t, i));
3) Когда обращаюсь к объекту VirtualString он начинает выдавать массив с определённой позиции.
И я не создаю 200 строк.
Ура)