Если вы можете изменить свой потребительский код, чтобы использовать IReadOnlyList<T>
вместо List<T>
, тогда не составит труда написать класс, который преобразует Tuple<T,U>
в IReadOnlyList<T>
:
public sealed class TupleExtraction<T, U> : IReadOnlyList<T>
{
readonly List<Tuple<T, U>> _list;
public TupleExtraction(List<Tuple<T, U>> list)
{
_list = list;
}
public T this[int index] => _list[index].Item1;
public int Count => _list.Count;
public IEnumerator<T> GetEnumerator()
{
return _list.Select(item => item.Item1).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return _list.Select(item => item.Item1).GetEnumerator();
}
}
Затем вы можете использовать это так:
class Program
{
static void Main()
{
List<Tuple<string, int>> test = new List<Tuple<string, int>>
{
new Tuple<string, int>("one", 1),
new Tuple<string, int>("two", 2),
new Tuple<string, int>("three", 3)
};
var extract = new TupleExtraction<string, int>(test);
for (int i = 0; i < extract.Count; ++i)
Console.WriteLine(extract[i]);
foreach (var item in extract)
Console.WriteLine(item);
}
}
Обратите внимание, что это не делает копию базового списка.