【发布时间】:2017-10-15 20:42:08
【问题描述】:
是否有更明智的方法来执行以下操作:
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]
}
编辑:既然人们要求一个用例,那就给你。
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);
}
}
}
【问题讨论】:
-
好吧,你可以创建一个数组......但实际上,我想说,这是一个相当不寻常的元组用法。你有具体的用例吗?
-
是的,通过理论进行 xunit 测试,您确实想要初始输入的值元组,您将它们转换为对象数组以使 xunit 满意,然后在测试方法中将它们作为原始类型提取出来
-
什么?发布您的测试代码。
-
IEnumerable <object[]>是一个可枚举的测试方法参数?这里没有显式转换? -
0 反对票似乎您想将元组转换为它不是的东西。这完全没问题,但也许你可以为此创建一个类,它具有所有 8 个元组形式的构造函数。这样您就可以让该类枚举、切片、计数,将其与另一个元组组合,将其转换回(较小的)元组等等。
标签: c# ienumerable valuetuple