0

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

//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 的值。

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

4

3 回答 3

1

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

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

于 2013-10-06T15:17:27.373 回答
0

实际上,我不知道您所说的“现在我想做的是能够调用作业列表并删除例如位置 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);

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

于 2013-10-06T15:23:56.467 回答
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 种方法中,然后你就不再需要它了。创建一个命名类通常是您想要做的。

于 2013-10-06T15:30:25.680 回答