c#动态改变元组大小

时间:2016-03-18 12:21:31

标签: c# tuples

基本上我想导出一些列表。 Theese列表包含不同的列。例如

StudentID - StudentName - Assignment1 - Assignment2 - 期末考试

但有时会有不同的考试。我正在使用元组类添加theese列表。

exportList.Add(new Tuple<string, string, string>(item.ID, item.Name + item.Surname, payList[i]));

这包含3列。有没有办法动态更改元组参数?

2 个答案:

答案 0 :(得分:1)

在你的情况下,我不会使用Tuple。我宁愿使用彼此继承的classes来允许变量属性。

例如:

public class Student // only a sample
{
    public string Name
    {
        get;
        set;
    }
}

public class StudentWithGrade : Student
{
    public int Grade
    {
        get;
        set;
    }
}

您的列表可以接受Student类型,可以是StudentStudenWithGrade或从学生继承的任何内容。

这使您的代码对其他人更具可读性。

修改

如果你真的需要一些东西动态,请使用词典列表, 列表中的一个条目表示row种类和条目 在Dictionary<string, object>中代表

答案 1 :(得分:1)

不,元组是不可变的。您似乎并没有将元组用于他们想要使用的内容。

如果您坚持不使用来保存数据,最好的选择是词典:

exportList.Add(new Dictionary<string, string>() { { "ID", item.ID }, { "Name", item.Name }, { "Surname", item.Surname }, { "PayList", payList[i] } });

现在,如果您获得整个项目,您将能够按如下方式编辑每个项目:

exportList[0]["ID"] = 11;
exportList[0]["Name"] = "Matías";
exportList[0]["Surname"] = "Fidemraizer";

另一个选择是使用动态对象,如ExpandoObject

dynamic person = new ExpandoObject();
person.ID = 11;
person.Name = "Matías";
person.Surname = "Fidemraizer";

exportList.Add(person);

由于ExpandoObject实现IDictionary<string, object>,您可以使用常规点语法访问属性,或者您可以将ExpandoObject转换为IDictionary<string, object>并将属性作为字典键访问:

dynamic person = exportList[0];
string name = person.Name;

// or...

IDictionary<string, object> person = (IDictionary<string, object>)exportList[0];
string name = (string)person["Name"];
顺便说一句,我仍然觉得你应该去设计和使用一个真正的课程来抓住你的人。数据无论如何...