【问题标题】:Converting a selection of a list of objects to an array while the list is being modified在修改列表时将选择的对象列表转换为数组
【发布时间】:2017-08-30 05:34:51
【问题描述】:

因此,我正在收集手机传感器数据并将其填充到以每个传感器的特定类开头的对象列表中:

    public class accbuff
    {
        public double ax { get; set; }
        public double ay { get; set; }
        public double az { get; set; }
        public long acct { get; set; }
    }

然后我将每个新的传感器读取事件 (e.Values) 和时间戳附加到列表中:

                accList.Add(new accbuff
                {
                    ax = e.Values[0],
                    ay = e.Values[1],
                    az = e.Values[2],
                    acct = stopwatch.ElapsedMilliseconds
                });

最后,经过一段时间后,我想将列表内容传递给我拥有的某种科学计算方法,然后清除列表并重置计时器。

这是我需要帮助的地方。清除列表或重置计时器没有问题,但我无法从列表中复制数据,因为在将副本枚举到数组时,新的传感器读数会修改列表。

传感器读数发生在大约 500 赫兹。如果我尝试以下类似的操作,我会因为修改而收到枚举错误。

 long[] at = accList.Select(x => x.acct).ToArray();
 stopwatch.Restart();
 accList.Clear();

我知道我可以锁定它,但我实际上不想在将列表复制到数组以供进一步使用时出现传感器读数的间隙。任何继续进行的策略都会非常有帮助。谢谢!

【问题讨论】:

    标签: c# android arrays list xamarin


    【解决方案1】:

    我希望这会有所帮助:

    long[] at = accList.ToList().Select(x => x.acct).ToArray();
    stopwatch.Restart();
    accList.Clear();
    

    【讨论】:

      【解决方案2】:

      您需要在列表更新时选择属性之前创建List 的单独副本:

      var listCopy = accList.ToList();
      

      然后使用listCopy:

      long[] at = listCopy.Select(x => x.acct).ToArray();
      stopwatch.Restart();
      accList.Clear();
      

      你也可以快捷方式:

      long[] at = accList.ToList().Select(x => x.acct).ToArray();
      stopwatch.Restart();
      accList.Clear();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多