首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ValueTuple转换为IEnumerable

将ValueTuple转换为IEnumerable
EN

Stack Overflow用户
提问于 2017-05-17 00:35:07
回答 3查看 2.7K关注 0票数 13

有没有一种更明智的方法来做以下事情:

代码语言:javascript
复制
public static class ValueTupleAdditions {
  public static IEnumerable<object> ToEnumerable<A, B>(this ValueTuple<A, B> tuple) {
    yield return tuple.Item1;
    yield return tuple.Item2;
  }
  public static IEnumerable<object> ToEnumerable<A, B, C>(this ValueTuple<A, B, C> tuple) {
    yield return tuple.Item1;
    yield return tuple.Item2;
    yield return tuple.Item3;
  }

  [etc]
}

编辑:由于人们正在询问一个用例,所以您可以使用它。

代码语言:javascript
复制
using Xunit;

namespace Whatever {

  public class SomeTestClass {
    public static IEnumerable<(string, Expression<Func<string, string>>, string)> RawTestData() {
      yield return ("Hello", str => str.Substring(3), "lo");
      yield return ("World", str => str.Substring(0, 4), "worl");
    }
    public static IEnumerable<object[]> StringTestData() {
      return RawTestData().Select(vt => new object[] { vt.Item1, vt.Item2, vt.Item3 });
       // would prefer to call RawTestData().Select(vt => vt.ToArray()) here, but it doesn't exist.
    }

    [Theory, MemberData(nameof(StringTestData))]
    public void RunStringTest(string input, Expression<Func<string, string>> func, string expectedOutput) {
      var output = func.Compile()(input);
      Assert.Equal(expectedOutput, output);
    }
  }
}
EN

回答 3

Stack Overflow用户

发布于 2017-08-02 03:30:41

一种方法是通过ITuple interface

代码语言:javascript
复制
public interface ITuple
{
    int Length { get; }
    object this[int index] { get; }
}

它只在.NET核心2.0,Mono5.0和.NET框架的下一个版本(未发布,在4.7之后)中可用。它不能(也永远不会)通过ValueTuple包作为旧框架的附加组件。

此API旨在供C#编译器在未来的模式工作中使用。

票数 3
EN

Stack Overflow用户

发布于 2017-05-17 00:58:19

稍微反思一下:

代码语言:javascript
复制
namespace ConsoleApp1
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    public class Program
    {
        public static void Main()
        {
            var tuple = (1, 2, 3, 4, 5, 6, 7);
            var items = ToEnumerable(tuple);

            foreach (var item in items)
            {
                Console.WriteLine(item);
            }
        }

        private static IEnumerable<object> ToEnumerable(object tuple)
        {
            if (tuple.GetType().GetInterface("ITupleInternal") != null)
            {
                foreach (var prop in tuple.GetType()
                    .GetFields()
                    .Where(x => x.Name.StartsWith("Item")))
                {
                    yield return prop.GetValue(tuple);
                }
            }
            else
            {
                throw new ArgumentException("Not a tuple!");
            }
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-11-12 16:08:03

一种方法是使用基于ITuple的扩展方法,另请参阅answer by Julien Couvreur

代码语言:javascript
复制
public static IEnumerable<T> ToEnumerable<T>( this ITuple tuple ) {
    for ( var n = 0; n < tuple.Length; n++ ) yield return (T)tuple[ n ];
}

示例用法:

代码语言:javascript
复制
var directions = (
    right: (cx: 1, cy: 0),
    down: (cx: 0, cy: 1),
    left: (cx: -1, cy: 0),
    up: (cx: 0, cy: -1)
);
foreach ( var direction in directions.ToEnumerable<(int cx, int cy)>() ) {
    var (cx, cy) = direction;
    TryMovePiece( (x + cx, y + cy) );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44007004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档