C# 将匿名值存储在列表中,并分别提取每个值

C# 将匿名值存储在列表中,并分别提取每个值,c#,arrays,list,anonymous,storing-data,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的n

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

//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值为例


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

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


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

事实上,我不知道您所说的“现在我想做的是能够调用joblist并删除位置4处的numBytes(例如,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);
var jobs=newlist();
对于(int i=0;i<100;i++)
{
字符串newJob=“Job”+i;
int numBytes=i;
所需时间间隔时间=新时间间隔(0,0,i);
//保存所有信息
var job=new{newJob,numBytes,requiredTime};
jobs.Add(job);
}
jobs.RemoveAll(p=>p.numBytes>50);
与此相反,我同意您问题下面的评论,并将创建一个普通类,该类保存您需要的属性,并将其实例放入列表中。动力学应该只在非常罕见的情况下使用,而您的动力学听起来并不是非常特殊。

在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);

关于C#,有一件事需要注意:

new { newJob, numBytes, requiredTime };

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

为什么要使用
Convert.ToString()
?这毫无意义。你打算用这种方法做什么?我认为为
jobs
创建一个类,并将
newJob、numBytes、requiredTime
作为属性,这将使您的工作更轻松,您所说的“删除numBytes”是什么意思?您的意思是将对象的属性设置为0,还是实际删除该属性?这感觉就像你在尝试用C#编写JavaScript。。。您可以使用
动态
执行某些操作,或者只使用
字典
而不是匿名对象。对我来说,这听起来像是你试图将C#视为一种动态语言,而事实并非如此。@CodingWithPike我很抱歉说“删除”我现在想不出更好的词了,但我想做的是以numBytes的值为例,在其他地方使用(而不是实际删除)你是说为newJob制作3个单独的列表,多少字节,需要多少时间?我也把它打印出来了,但我想知道是否有一种方法可以将所有内容都保存在一个列表中,以限制来自其他类的调用和诸如此类的内容。这比我脑子里想的要难解释,所以我道歉,但把它想象成一个3×n的数组;这就是我想要实现的你知道C语言的课程吗?让你自己熟悉他们。匿名类型基本上是一个没有名称的类。您还可以创建具有名称的类。创建一个包含三个属性的类来保存数据。因此,我创建了一个Job类,其中有三个参数就是上面提到的参数,并将它们称为Job.newJob.example。这是你所拥有的最佳实践。默认情况下,您应该考虑将结构化数据存储在由自定义类组成的对象模型中。这里还有另一个答案,就是建议使用动态-这是有效的,也有它的位置,但它更像是最后的解决方案。你想要的是发挥C语言的优势,C语言是丰富的类和静态类型。匿名类型也是静态类型,但由于无法命名该类型,因此无法声明静态类型列表来保存它们。您也不能将它们用作方法的返回类型。非常感谢您的见解!不看代码我很难理解,但是你的评论让我更容易理解@CodingWithSpikeThank you所说的话!这是完美的,我相信@usr也能做到这一点,多亏了两者!
new { newJob, numBytes, requiredTime };