2014-03-31 42 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); });