多类型和多维数组(或列表或字典)?

时间:2017-09-07 09:01:14

标签: c#

无法找到确切的问题...我想创建一个列表(或字典或数组,无论它在C#,.NET中调用),我可以存储不同类型的数组/列表/字符串。

例如,在PHP中,我这样做:

$x= array (
   'Names'=> array( "James", "Nicolas", "Susan"),    //Strings
   'Age'=> array( 18, 52, 37),                       //Int
   'Male'=> array( true, true, false),               //Bool
);

如何在C#/ .NET中实现类似的功能?

P.S。或者如果可能的话,多种类型,例如:

$y = array ( 
    $x => (
     ..... multi-element, like above

    ),
    $z => (
     ..... multi-element, like above

    )
);

4 个答案:

答案 0 :(得分:3)

创建一个包含List<string>List<int>List<string>信息的类。然而,更好的方法是将单个实体的所有信息保存为单个类并存储这些项的列表:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool Male { get; set; }
}

现在将该类型的实例存储在列表中:

var list = new List<Person> { 
    new Person { Name = "James", Age = 18, Male = true }, 
    new Person { Name = "Nicolas", Age = 52, Male = true }, 
    new Person { Name = "Susan", Age = 37, Male = false }
};

这样您就不需要“同步”所有三个列表,而是只有一个列表。

如果你真的必须使用你所描述的方法,那么定义一个包含三个不同列表的类:

class Persons
{
    public List<string> Names { get; set; }
    public List<int> Ages { get; set; }
    public List<bool> Male { get; set; }
}

现在您可以按如下方式创建您的人员:

var persons = new Persons { 
    Names = new List<string> { "James", "Nicolas", "Susan"},
    Ages = new List<int> { 17, 53, 37 },
    Male = new List<bool> { true, true, false }
}

然而,这非常困难,因为每次删除名称时,您还必须删除相应的age-和male-element。像这样:

persons.Names.RemoveAt(1);
persons.Ages.RemoveAt(1);
persons.Male.RemoveAt(1);

答案 1 :(得分:3)

在版本7之前的C#中,您必须创建一个可以存储列表的类:

class Item {
    public List<string> Names { get; }
    public List<int> Ages { get; }
    public List<bool> Males { get; }
}

您还可以使用元组,但不具备描述性属性名称的缺点:

Tuple<List<string>, List<int>, List<bool>> tuple =
    Tuple.Create(new List<string>(), new List<int>(), new List<bool>());

在C#7中,您可以使用值元组而无需创建类:

(List<string> Names, List<int> Ages, List<bool> Males) itemLists =
    (new List<string>(), new List<int>(), new List<bool>());

并访问这样的组件:

List<string> names = itemLists.Names;

您应该认真考虑不创建包含列表的类,而是包含类(或元组)的列表。以下是C#7值元组的示例:

List<(string Name, int Age, bool Male)> list = new List<(string, int, bool)>();

这个结构通常更容易处理,因为你可以循环一个列表,然后处理一个包含所有相关数据的项目。

答案 2 :(得分:2)

正如@HimBromBeere所说,你可以创建一个.aside2>div类:

Person

现在您需要定义另一个存储结果的类

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool Male { get; set; }
}

此时您可以使用Linq将人员列表转换为您的预期输出

public class Result
{
    public List<string> Names { get; } = new List<string>();
    public List<int> Age { get; } = new List<int>();
    public List<bool> Male { get; } = new List<bool>();
}

答案 3 :(得分:0)

如果您使用的是C#3或更高版本,则可以使用匿名对象:

var x = new
{
    Names = new[] {"James", "Nicolas", "Susan"},
    Age = new[] {18, 52, 37},
    Male = new[] {true, true, false}
};

对于您的第二个示例,您可以使用此代码:

var y = new
{
    x = new
    {
        Names = new[] {"James", "Nicolas", "Susan"},
        Age = new[] {18, 52, 37},
        Male = new[] {true, true, false}
    },
    // z = new { /* same code as above */ }
};