C # ValueTuple любого размера - PullRequest
2 голосов
/ 02 июня 2019

Можно ли написать метод C #, который принимает кортеж значения с любым количеством элементов одного типа и преобразует их в список?

Изменить 2/6/2019 Я принял Предоставленный ответ как правильный. Я хотел также предоставить решение, которое использует базовый класс, который не является интерфейсом, потому что я пытаюсь написать оператор преобразования, и определенные пользователем преобразования из интерфейса не допускаются.

public static class TupleExtensions
{
    public static IEnumerable<object> Enumerate(this ValueType tpl)
    {
        var ivt = tpl as ITuple;
        if (ivt == null) yield break;

        for (int i = 0; i < ivt.Length; i++)
        {
            yield return ivt[i];
        }
    }
}

1 Ответ

3 голосов
/ 02 июня 2019

Вы можете использовать тот факт, что ValueTuples реализуют интерфейс ITuple .

Единственная проблема заключается в том, что элементы кортежа могут быть произвольного типа, поэтому список должен принимать любой тип.

public List<object> TupleToList(ITuple tuple)
{
  var result = new List<object>(tuple.Length);
  for (int i = 0; i < tuple.Length; i++)
  {
    result.Add(tuple[i]);
  }
  return result;
}

Это также работает как метод расширения:

public static class ValueTupleExtensions
{
  public static List<object> ToList(this ITuple tuple)
  {
    var result = new List<object>(tuple.Length);
    for (int i = 0; i < tuple.Length; i++)
    {
      result.Add(tuple[i]);
    }
    return result;
  }
}

Таким способом можно написать var list = (123, "Text").ToList();.

...