【问题标题】:c# How To Access Elements of a List<Class>c# 如何访问 List<Class> 的元素
【发布时间】:2014-03-31 09:53:07
【问题描述】:

我想访问类列表中的某个字段,以便在循环中进行计算。

这是我的第一堂课:

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

然后我的名单List&lt;Hold&gt;Data;

然后我使用 Linq 存储来自查询的值。

我最理想的做法是像这样访问列表的时间部分:

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

【问题讨论】:

  • 我想知道你想在你的 for 循环中做什么,也许有一个更简单的方法使用 Linq 并完全删除循环
  • 从他的变量的命名来看,我假设他正在尝试计算他的日期的平均值。请注意,您不能将 DateTime 分配给 double,并且在循环内声明变量不会使其在外部可见。此外,您分配值的方式将在每次迭代时覆盖前一个。
  • @SaverioTerracciano 我打赌这不是他的全部代码。也许他对“循环局部”变量做了更多的事情?你知道吗?
  • 您可能是对的,但他仍然无法将 DateTime 分配给 double,并且变量的命名与代码显示的不匹配。
  • @SaverioTerracciano 那么,etc etc 是什么?也许是.TotalMillseconds。突然之间它是正确的。我只是认为根据原始问题中的错误对答案投反对票是不公平的。您不妨对所有引用字符串连接的 SQL 语句的答案投反对票,因为它对 SQL 注入开放。 OP 想知道如何索引列表/如何访问列表中单个项目的成员,这就是我们所展示的。他并不是要问如何在DateTime 上建立一个平均值(无论如何,该值是多少)。

标签: c# list


【解决方案1】:

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

您需要将类实例列表转换为要进行计算的值列表。您可以使用Select 扩展方法来做到这一点。

您需要计算平均值。您可以使用Average 扩展方法来做到这一点。

var data = new List<Hold>();

// fill list 

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

var average = transformed.Average();

您可以通过使用包含转换的 Average 扩展方法的重载,通过一个简单的步骤完成此操作:

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

【讨论】:

    【解决方案2】:

    该列表没有“时间部分”。列表持有的对象有一个Time 成员。

    你可以这样做:

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

    为了让 Saverio 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>;
    }
    

    【讨论】:

    • 在 for 中声明变量总是会在下一次迭代中重新赋值。 Time 属性是 DateTime,不能分配给 double。在 for 中声明的变量在 for 循环之外是不可见的。
    • 在投反对票之前,请下次阅读原帖?我只是引用OP所写的内容。您也可以争辩 etc etc 不是有效的 C# 语法...
    • 是的,但如果原帖有问题,我认为这不应该意味着错误的答案。您不能直接将 DateTime 转换为 double。
    • @SaverioTerracciano 你和我都不知道double average ... 行是否是他的真实代码。我认为根据零知识和您自己的“最佳实践”理解来否决答案有点不公平。
    • @SaverioTerracciano 希望你现在更快乐。
    【解决方案3】:

    您需要将索引器Data[i] 与列表对象一起使用。您的数据类型为 DateTime,不应直接分配为 double。

    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
    }
    

    【讨论】:

    • 在 for 中声明变量总是会在下一次迭代中重新赋值。 Time 属性是 DateTime,不能分配给 double。在 for 中声明的变量在 for 循环外是不可见的
    【解决方案4】:

    正在寻找一个简单的 foreach?

    foreach(Hold h in Data)
    {
         DateTime t = h.Time;
    
         ... other properties or whatever method defined for the class Hold
    }
    

    一个List&lt;T&gt;实现了IEnumerator接口,所以当你需要遍历List的所有元素并提取其对象时使用foreach是很自然的

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

    但是,知道您想在循环内做什么会很有趣。
    也许有更简单的方法使用 Linq 并完全消除循环。

    例如,如果您想计算存储在列表中的时间值的平均秒数,您可以使用

    删除循环
     var k = data.Select(x => new TimeSpan(x.Time.Hour, x.Time.Minute, x.Time.Second))
                 .Average(z => z.TotalSeconds);
    

    【讨论】:

    • 在 foreach 中声明变量将始终在下一次迭代中重新分配其值。 Time 属性是 DateTime,不能分配给双精度。在 foreach 中声明的变量在 foreach 循环之外是不可见的。
    • 我只是在修复它,问题是我们不知道 OP 在循环中真正想要做什么。他似乎想计算某种平均值,但根据提供的数据很难给出准确的答案。
    • 你说得对,我指的是一些事情,这些事情在你的 sn-p 的当前版本中大部分都得到了解决。
    • 看起来像我正在尝试做的事情,我似乎在感谢史蒂夫,感谢大家的快速响应!
    【解决方案5】:

    如果我理解正确(根据您的变量名称),您想要计算日期时间值的平均值。你应该这样做:

    double totalTicks=0D;
    foreach(var x in Data){
       totalTicks+=x.Time.Ticks;
    }
    double averageTicks=totalTicks / Data.Count();
    DateTime avgDateTime=new DateTime(averageTicks);
    

    【讨论】:

      【解决方案6】:
      //get all values of Time Property from Data collection
      List<DateTime> dateList = new List<DateTime>();
      Data.ForEach((h)=> { dateList.Add(h.Time); });
      

      【讨论】:

        猜你喜欢
        • 2021-06-01
        • 2017-11-09
        • 2022-01-13
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        相关资源
        最近更新 更多