如何从LIST [STRING]获取值到LIST [Object] [英] How to get values from LIST[STRING] into LIST[Object]

查看:92
本文介绍了如何从LIST [STRING]获取值到LIST [Object]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨朋友们,



这个问题听起来很简单但我必须详细说明我想要的东西。



在我的应用程序中,我读取了一个文件,并将所有行设置为 LIST< STRING> _allFileLines object。

我现在在集合中使用a迭代来读取所有行并将值解析为 float [] fieldsPerLine 。我得到每个数组4个浮点值。那没关系。



之后我在一个名为 FileItemValues的对象中设置值

该对象包含13个浮点值。数组中的4和基于前4的4个计算值。



每个 FileItemValues 被添加到 LIST< FileItemValues>



由于每个文件最少有30,000条记录,因此处理大约需要30秒(迭代,计算,添加新对象并确定 LIST< FileItemValues>


中13个属性中的每个属性的最大值
如何使用LINQ更快地完成这些步骤:

- 从列表< String> 列出< FileItemValues> 仅查找列表中的前4个值< String>

- 计算其他9个列表< FileItemValues>

中的字段 - 确定列表< FileItemValues> 设置在 FileItemValues 对象中。



问候



ps:

当前的iterati ng from list< string>浮动[]:

Hi Friends,

the question sounds simple but I have to elaborate more what I want.

In my application I read a file and set all the lines in a LIST<STRING> _allFileLines object.
I now iterate with a for each over the collection to read all lines and parse the values to a float[] fieldsPerLine. I get 4 float values per array. That's OK.

After that I set the values in an object called FileItemValues
That object holds 13 float values. The 4 in the array and 9 calculated values based on the first 4.

Each FileItemValues is added to a LIST<FileItemValues>.

Since each file holds minimal 30,000 records, it takes around 30 seconds to process(iterating, calculating, adding to new object and determine the Maximum values for each of the 13 properties in the LIST<FileItemValues>

How can this be done quicker with LINQ where the steps are:
- From List<String> to List<FileItemValues> for only the first 4 values found in List<String>
- calculate the 9 other fields in the List<FileItemValues>
- Determine maximum values for each property in List<FileItemValues> set in a FileItemValues object.

Regards

ps:
current iterating from list<string> to float[]:

foreach (var fileLine in _allFileLines)
            {
                float[] fieldsPerLine = fileLine.Trim().Split(new char[]{','}, StringSplitOptions.RemoveEmptyEntries).Select(float.Parse).ToArray();





此时下一部分让我放慢脚步:



At this moment the next part is slowing me down:

foreach (var fileLine in resultProef)
            {
                FileItemValues currentLineValues = new FileItemValues();
                currentLineValues.MilliSecs = fileLine[0];
                currentLineValues.PosX = fileLine[1];
                currentLineValues.PosY = fileLine[2];
                currentLineValues.PosYerk = fileLine[3];
                currentLineValues.MutatieSnelheidX = _positions.Count > 0 ? (currentLineValues.PosX - _positions[_positions.Count - 1].PosX) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                currentLineValues.MutatieSnelheidY = _positions.Count > 0 ? (currentLineValues.PosY - _positions[_positions.Count - 1].PosY) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                currentLineValues.MutatieSnelheidRotatie = _positions.Count > 0 ? (currentLineValues.PosYerk - _positions[_positions.Count - 1].PosYerk) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                currentLineValues.MutatieAcceleratieX = _positions.Count > 0 ? (currentLineValues.MutatieSnelheidX - _positions[_positions.Count - 1].MutatieSnelheidX) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                currentLineValues.MutatieAcceleratieY = _positions.Count > 0 ? (currentLineValues.MutatieSnelheidY - _positions[_positions.Count - 1].MutatieSnelheidY) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                currentLineValues.MutatieAcceleratieRotatie = _positions.Count > 0 ? (currentLineValues.MutatieSnelheidRotatie - _positions[_positions.Count - 1].MutatieSnelheidRotatie) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                currentLineValues.MutatieJerkX = _positions.Count > 0 ? (currentLineValues.MutatieAcceleratieX - _positions[_positions.Count - 1].MutatieAcceleratieX) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                currentLineValues.MutatieJerkY = _positions.Count > 0 ? (currentLineValues.MutatieAcceleratieY - _positions[_positions.Count - 1].MutatieAcceleratieY) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                currentLineValues.MutatieJerkRotatie = _positions.Count > 0 ? (currentLineValues.MutatieAcceleratieRotatie - _positions[_positions.Count - 1].MutatieAcceleratieRotatie) / (currentLineValues.MilliSecs - _positions[_positions.Count - 1].MilliSecs) : 0;
                _positions.Add(currentLineValues);
               
            }

推荐答案

您可以通过将最后添加的项目存储在变量中来获得一些改进,而不是每次都从列表中检索它。



在开始循环之前,你应该确保 _positions 列表有足够的容量。



你也可以预先计算分母,因为每个属性除以相同的值。

You might get some improvement by storing the last added item in a variable, rather than retrieving it from the list every time.

You should ensure that the _positions list has sufficient capacity before you start the loop.

You could also pre-calculate the denominator, since each property is divided by the same value.
_positions.Capacity = _positions.Count + resultProef.Count;

FileItemValues previousLineValues = null;
foreach (var fileLine in resultProef)
{
    FileItemValues currentLineValues = new FileItemValues();
    currentLineValues.MilliSecs = fileLine[0];
    currentLineValues.PosX = fileLine[1];
    currentLineValues.PosY = fileLine[2];
    currentLineValues.PosYerk = fileLine[3];
    
    if (previousLineValues != null)
    {
        float denominator = currentLineValues.MilliSecs - previousLineValues.MilliSecs;
        
        currentLineValues.MutatieSnelheidX = (currentLineValues.PosX - previousLineValues.PosX) / denominator;
        currentLineValues.MutatieSnelheidY = (currentLineValues.PosY - previousLineValues.PosY) / denominator;
        currentLineValues.MutatieSnelheidRotatie = (currentLineValues.PosYerk - previousLineValues.PosYerk) / denominator;
        
        currentLineValues.MutatieAcceleratieX = (currentLineValues.MutatieSnelheidX - previousLineValues.MutatieSnelheidX) / denominator;
        currentLineValues.MutatieAcceleratieY = (currentLineValues.MutatieSnelheidY - previousLineValues.MutatieSnelheidY) / denominator;
        currentLineValues.MutatieAcceleratieRotatie = (currentLineValues.MutatieSnelheidRotatie - previousLineValues.MutatieSnelheidRotatie) / denominator;
        
        currentLineValues.MutatieJerkX = (currentLineValues.MutatieAcceleratieX - previousLineValues.MutatieAcceleratieX) / denominator;
        currentLineValues.MutatieJerkY = (currentLineValues.MutatieAcceleratieY - previousLineValues.MutatieAcceleratieY) / denominator;
        currentLineValues.MutatieJerkRotatie = (currentLineValues.MutatieAcceleratieRotatie - previousLineValues.MutatieAcceleratieRotatie) / denominator;
    }
    
    _positions.Add(currentLineValues);
    previousLineValues = currentLineValues;
}


这篇关于如何从LIST [STRING]获取值到LIST [Object]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆