将匿名值存储在列表中并单独提取每个值

时间:2013-10-06 15:11:04

标签: c# arrays list anonymous storing-data

我正在尝试将信息存储在匿名值块中

//holds all info
var jobs = new { newJob, numBytes, requiredTime };

然后获取该信息并将其作为单个元素放入列表中

//puts above info into a list
joblist.Add(Convert.ToString(jobs));
Console.WriteLine(joblist[0]);   //testing purposes

现在我想做的是能够调用joblist并在第4位获取示例numBytes的值。

这可能吗?或者有人可以帮助另外一种方法吗?非常感谢!

3 个答案:

答案 0 :(得分:1)

创建一个命名类。然后,您可以获得该类型的对象列表,并以您想要的任何方式操作该列表。

使用课程是您尝试做的最佳实践。默认情况下,您应该考虑将结构化数据存储在由自定义类组成的对象模型中。这里有另一个答案,建议使用动态 - 这是有效的,有它的位置,但它更多的是最后的解决方案。你想要的是发挥C#的优势,它们是丰富的类和静态类型。匿名类型也是静态类型的,但由于您无法命名类型,因此您无法声明静态类型列表来保存它们。您也不能将它们用作返回类型的方法。

答案 1 :(得分:0)

实际上我并不确切地知道你对的意思“现在我想做的是能够调用joblist并删除例如位置4的numBytes。”

但我想你只是想把对象放在一个列表中并查询numBytes并删除一些元素。

通过动态,您可以处理动态对象......

var jobs = new List<dynamic>();
for (int i = 0; i < 100; i++)
{
    string newJob = "Job" + i;
    int numBytes = i;
    TimeSpan requiredTime = new TimeSpan(0,0,i);
    //holds all info
    var job = new { newJob, numBytes, requiredTime };
    jobs.Add(job);
}

jobs.RemoveAll(p => p.numBytes > 50);

而不是这个,我同意你的问题下面的评论,并会创建一个普通的类,它包含你需要的属性,并简单地将其实例放入列表中。动态应该只在非常罕见的情况下使用,而你的声音听起来并不是特别的。

答案 2 :(得分:0)

在C#中要做的“正常”事情是创建一个类来保存要存储的信息。例如:

public class Job
{
    public string Name { get; set; }
    public int NumBytes { get; set; }
    public DateTime RequiredTime { get; set; }
}

然后您可以将这些添加到列表中:

var jobs = new List<Job>();

var aJob = new Job();
aJob.Name = "Job 1";
aJob.NumBytes = 123;

jobs.add(aJob);

然后您可以通过列表中的索引访问作业:

var jobNumBytes = jobs[3].NumBytes;

有关C#的注意事项,当你这样做时:

new { newJob, numBytes, requiredTime };

编译器在构建时只创建一个强类型类(就像我上面创建的Job类),并为它生成一个随机名称。它从您分配给它的变量中推断出属性名称和类型。创建的.exe或.dll实际上包含此类型的类定义,您无法轻松地从代码中的其他位置获取它。它不是真正的“动态”。因此,使用该语法通常只是一种懒惰的方式来声明您只需要片刻的类。通常只在1方法内,那么你不再需要它了。创建命名类通常是您想要做的。