动态创建具有所有相同类型和已知数量元素的元组

时间:2017-03-30 18:56:24

标签: c# dictionary tuples

我希望动态创建具有相同类型的给定大小的元组。

因此,如果我想要一个大小为3的字符串元组,我会得到Tuple< string,string,string>

我已经尝试过将字符串传递给Tuple的尖括号,如下所示:

string foo = "string, string, string";
Tuple<foo> testTuple = Tuple<foo>(~parameters~);

并将类型数组传递到尖括号中,如下所示:

List<Type> types = new List<Type>() {"".GetType(), "".GetType(), "".GetType()};
Tuple<types> testTuple = Tuple<foo>(~parameters~);

这些都没有奏效。有谁知道如何制作描述的动态元组?

(我想这样做的原因是在字典中使用元组,如

Dictionary<Tuple<# strings>, int> testDictionary = new Dictionary<Tuple<x # strings>, int>();

在这里使用元组比HashSets更有用,因为元组中的比较是通过组件而不是引用,所以如果我有

Tuple<string, string> testTuple1 = new Tuple<string, string>("yes", "no");
Tuple<string, string> testTuple2 = new Tuple<string, string>("yes", "no");
Dictionary<Tuple<string, string>, string> testDictionary = new Dictionary<Tuple<string, string>, string>() {
    {testTuple1, "maybe"}
};
Console.WriteLine(testDict[testTuple2]);

它写的“可能”。如果使用HashSet运行相同的测试,则会引发错误。如果有更好的方法来完成同样的事情,那也会很有用。)

3 个答案:

答案 0 :(得分:1)

你可以使用反射做这样的事情:

    public static object GetTuple<T>(params T[] values)
    {
        Type genericType = Type.GetType("System.Tuple`" + values.Length);
        Type[] typeArgs = values.Select(_ => typeof(T)).ToArray();
        Type specificType = genericType.MakeGenericType(typeArgs);
        object[] constructorArguments = values.Cast<object>().ToArray();
        return Activator.CreateInstance(specificType, constructorArguments);
    }

这将为您提供可变数量元素的元组。

答案 1 :(得分:1)

&#34;有谁知道如何制作描述的动态元组?&#34;

您可以使用Tuple.Create()。对于3-tuple

var tupleOfStrings = Tuple.Create("string1", "string2", "string3");
var tupleOfInts = Tuple.Create(1, 2, 3);

答案 2 :(得分:0)

在内部设置List<string>的自定义类型(如果需要通用解决方案,则为List<T>

覆盖object.Equals:在自定义类

中使用Enumerable.SequenceEqual作为内部列表

覆盖object.GetHashCode()以便在字典中使用您的类型