2014-03-31 40 views
1

我想访问类列表中的某个字段,以便我可以在循环中进行计算。c#如何访问列表中的元素<Class>

这是我的第一类:

public class Hold 
{ 
    public DateTime Time { get; set; } 
    public Double XPosition { get; set; } 
    public Double YPosition { get; set; } 
} 

然后我的名单List<Hold>Data;

然后我使用LINQ从查询储存值。

我非常想要做的就是访问列表的时间部分,像这样:

for(int i =0; i < Data.Count; i++) 
{ 
    double average = Data.Time // etc etc 
} 
+0

我想知道你想里面的for循环,也许是使用LINQ一个简单的方法吗啥子和完全的命名消除环路 – Steve

+0

他变量,我假设他正在计算他的日期的平均值。 请注意,您不能将DateTime分配给double,并且在循环内声明变量不会使其在外部可见。此外,您分配值的方式将在每次迭代中覆盖前一个值。 –

+0

@SaverioTerracciano我*下注*这不是他的所有代码。也许他用“loop-local”变量做了更多的事情?你知道吗? –

回答

1

您需要使用索引Data[i]与列表对象。你有数据类型的DateTime,不应该被指派为直接加倍。

for(int i =0; i < Data.Count; i++) 
{  
    //double average = Data[i].Time; 
    //Your code goes here. 
} 

您可以使用foreach循环

for(var data in Data) 
{ 
    //data.Time   //You can use data.Time here 
} 
+0

声明for内部的变量将始终在下一次迭代中重新分配其值。 Time属性是DateTime,不能分配给double。在for内部声明的变量在for循环外面不可见 –

+0

我错过了那一点,谢谢指出,更新了答案。 – Adil

2

寻找一个简单的foreach?

foreach(Hold h in Data) 
{ 
    DateTime t = h.Time; 

    ... other properties or whatever method defined for the class Hold 
} 

一个List<T>实现IEnumerator接口,所以很自然的,当你需要循环使用的foreach在列表中的所有元素,并提取其对象

与在foreach方法的唯一可能的问题是如果您需要从列表中删除元素,同时迭代它们。但是如果你不需要这个,那么foreach是访问列表中元素的最简单和最自然的方式。

然而,知道你想要在循环中做什么会很有趣。
也许有更简单的方法使用Linq并完全删除循环。

例如,如果要计算存储在列表中选择时的平均值秒,你可以删除使用

var k = data.Select(x => new TimeSpan(x.Time.Hour, x.Time.Minute, x.Time.Second)) 
      .Average(z => z.TotalSeconds); 
+0

声明foreach中的变量总是会在下一次迭代中重新赋值。 Time属性是DateTime,不能分配给double。在foreach中声明的变量在foreach循环之外是不可见的。 –

+0

我只是修复它,问题是我们不知道OP真的想在循环中做什么。他似乎想要计算某种平均值,但提供的数据很难给出确切的答案。 – Steve

+0

你是对的,我指出了几件事情,这些事情大部分都是在你的代码片段的当前版本中解决的。 –

1

列表不具有“部分时间”的循环。列表中的对象有一个Time成员。

你可以这样做:

for(int i =0; i < Data.Count; i++) 
{ 
    double average = Data[i].Time etc etc 
} 

为了萨维里奥Terracciano高兴:

for (int i = 0; i < Data.Count; i++) 
{ 
    // Access members of Hold, write something like 
    ... = Data[i].<Member Name> 
} 

如果你没有在其他任何地方评估i不仅仅是用于索引列表,你也可以写

foreach (Hold h in Data) 
{ 
    ... = h.<Member Name>; 
} 
+0

声明for内部的变量总是会在下一次迭代中重新赋值。 Time属性是DateTime,不能分配给double。在for中声明的变量在for循环之外将不可见。 –

+0

在你downvote之前,请下次阅读原帖?我只是引用了OP的内容。你可能会认为'etc etc'不是有效的C#语法... –

+0

是的,但是如果在原文中有什么问题,我不认为这应该意味着错误的答案。您不能直接将DateTime转换为double。 –

1

要创建你需要采取两个步骤列表的成员平均:

您需要变换类实例的列表,你想要做你的计算值的列表。您可以使用Select扩展方法执行此操作。

您需要计算平均值。您可以使用Average扩展方法执行此操作。

var data = new List<Hold>(); 

// fill list 

var transformed = data.Select(hold => hold.Time); 

var average = transformed.Average(); 

您可以通过使用包含平均扩展方法的重载在一个简单的步骤,做到这一点的变换:

var average = data.Average(hold => hold.Time); 
0

如果我理解正确的话(从你的变量名)要计算您的日期时间值的平均值。你应该做这样的事情:

double totalTicks=0D; 
foreach(var x in Data){ 
    totalTicks+=x.Time.Ticks; 
} 
double averageTicks=totalTicks/Data.Count(); 
DateTime avgDateTime=new DateTime(averageTicks); 
0
//get all values of Time Property from Data collection 
List<DateTime> dateList = new List<DateTime>(); 
Data.ForEach((h)=> { dateList.Add(h.Time); });