none
如何快速地对类数组的字段进行赋值? RRS feed

  • 问题

  • 有这样一个类

    public class Measurement
        {
            public double Time { get; set; }
            public double Value { get; set; }
            public double Minimum { get; set; }
            public double Maximum { get; set; }
        }

    四个字段表示了采样的时间、有效值、最大值、最小值。由于是调用硬件提供的API接口,实际操作时,返回的是一个数组。

    public Collection<Measurement> Measurements { get; private set; }
    
    for(int i=0;i<N;i++)
    {
    Measurements.Add(new Measurement
                                         {
                                             Time = t[i],
                                             Value = v[i],
                                             Maximum = maximum[i],
                                             Minimum = minimum[i]
                                         });
    这里的t、v等是硬件API返回的double数组,N是数组的元素个数。目前通过集合的Add方法和for循环方式进行数据的赋值和显示,能够实现功能,但是效率太低,有没有更快速的赋值方式或者更合理的解决方案?

    2017年8月14日 3:26

答案

全部回复

  • Hi,

    如果代码要求插入操作比较快一点,我建议你使用链表来代替数组,这样插入的速度会快点。

    如果你的数据太多,你考虑过使用数据库吗? 数据库的访问速度相对比较快。

    下面这个是使用数据库来访问数据,希望对你有帮助。

    http://www.cnblogs.com/wangchuang/archive/2013/04/06/3002377.html 

    如果你的问题解决了,请及时标记有用的回复作为答案,这样会帮助遇到相同问题的人。

    Best Regards,

    Hart

    注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年8月14日 7:20
    版主
  • >>由于是调用硬件提供的API接口,实际操作时,返回的是一个数组。

    每次返回的是一个IEnumerable<T>类型数组,为何不直接操作遍历数组而是要再次存储到你自定义的集合里边呢?你有何特殊用意吗?或者说,系统返回的数据是什么样子的?你又需要什么样子的?


    Reproduce your quesions with   ScreenToGif is your choice.
    For IIS: IIS Forum,
    For WebSite of .NET, ASP.NET Forum,
    For others, StackExchange
    For spam-sender or forum urgent issues, Send your Email at: forumsfeedback@microsoft.com

    2017年8月14日 10:41
    版主
  • 返回的数据只是一块内存,可以将这部分内存的数据解释为一个结构体数组(new data[N])。另外,返回的数据是C++中的结构体概念,即4*8(双精度浮点数8字节) * N(N组数据)Byte的内存块。 

    struct data { double Time; double Value; double Minimum; double Maximum; }


    2017年8月16日 5:03
  • 我是为了能实现跟OxyPlot的绑定,所以把数据重新存到对应的类型中。不知道还有没有别的更好的方式实现显示。
    2017年8月16日 5:06
  • 1. 每次都重置Measurements的内容,显示每次采样的数据;

    2. public static extern int GetData([In,Out] data[] AFid, int count);

        AFid是当次采样的数据,count是采样点数,count一般大于8192,最大300w。

        数据源应该是要Collection,我看的OxyPlot的几个例子里面都是Collection;

    3、4*8*N,N不固定,是用户设置的参数。等于2中的count。

    4. 当前30w个点要差不多1min(i7+8G内存),希望能缩减到加几个动画就能过度的时间;

    5. N不固定,一般是几十万。

    谢谢!


    2017年8月21日 7:39
  • 看这个程式的逻辑,在阵列上面可以说是一次性的for loop透过索引取出值,没有特别的条件判断,實用層面上必要性不高,白白的浪費效能。这情形就像是,我已经包好了,结果又要重新开封在包一次很像一模一样的,假如要里面的值,我觉得只要写一个function,直接透过索引取结果,然后return一个class就可以了,不用再for一次。下面的code我是写一个示意,你可以自已编排,大概的逻辑是这样:

    class Measurements
    {
    	public double Time;
    	public double Value;
    	public double Minimum;
    	public double Maximum;
    }
    Measurements collection(int idx)
    {
    
    	Measurements r = new Measurements();
    	r.Time = t[idx];
    	r.Value = v[idx];
    	r.Maximum = maximum[idx];
    	r.Minimum = minimum[idx];
    	return r;
    }

    Measurements _m = collection(0);

    Console.WriteLine(_m.Time); Console.WriteLine(_m.Value); Console.WriteLine(_m.Minimum); Console.WriteLine(_m.Maximum);









    2017年8月21日 8:16
  • ???

    • 已标记为答案 ShannonZhou 2017年8月22日 7:54
    • 已编辑 [-] 2018年1月11日 11:28
    2017年8月22日 6:29
  • 膜拜大神!分析的很全面很透彻。

    不知道有没有比OxyPlot更高效的绘图库?

    2017年8月22日 7:55
  • 非常感谢!我要好好消化一下您的思路和代码!

    2017年8月23日 3:25
  • ???

    • 已标记为答案 ShannonZhou 2017年8月24日 1:18
    • 已编辑 [-] 2018年1月11日 11:28
    2017年8月23日 14:56
  • 多谢老师指导!膜拜~~~


    2017年8月24日 1:21
  • 非常感谢~从您的回帖内容中已经学到了好多东西,好多再在学校待十年也学不到的东西……感谢!!!
    2017年8月25日 8:29
  • 佩服得五体投地~~~

    您的方案非常棒,之前OxyPlot的版本已经能够满足我的需求,后续版本我都测试了一下非常棒,但是当中还要好多知识点我之前没接触过,所以还要慢慢研读,彻底消化之后才敢在实际中应用。

    总之非常感谢!

    2017年9月1日 6:12
  • 不知道这个问题如何解决?


    2017年9月1日 6:13
  • 谢谢老师!我好好研究下怎么开两个UI线程。
    2017年9月4日 2:36
  • https://social.msdn.microsoft.com/Forums/zh-CN/e9b1f2bf-9e1f-4917-be8f-2cfa785de5e9#e7b31401-2d04-452d-a4e9-3692043d33fe
    2017年9月4日 7:33
  • 别人的程序(可以显示实时数据,并且能够实时更改采样参数

    我写的程序

    参数更改非常卡顿。


    2017年9月5日 7:33