2014-03-31 50 views
1

要處理來自日誌文件的數據,我將數據讀入列表。將列表中的struct成員轉換爲數組

當我試圖從列表轉換爲圖表例程的數組時,我遇到了麻煩。

爲了討論起見,我們假設日誌文件包含三個值* - x,y和theta。在執行文件I/O的例程中,我讀取了三個值,將它們分配給一個結構並將結構添加到PostureList。

繪圖程序,希望x,y和theta在單個數組中。我的想法是使用ToArray()方法進行轉換,但是當我嘗試下面的語法時,出現錯誤 - 請參閱下面的註釋中的錯誤。我有一種替代方法來進行轉換,但希望獲得有關更好方法的建議。

我對C#很陌生。在此先感謝您的幫助。

注意:*實際上,日誌文件包含許多不同的有效負載大小的不同信息。

struct PostureStruct 
{ 
    public double x; 
    public double y; 
    public double theta; 
}; 

List<PostureStruct> PostureList = new List<PostureStruct>(); 

private void PlotPostureList() 
{ 
    double[] xValue = new double[PostureList.Count()]; 
    double[] yValue = new double[PostureList.Count()]; 
    double[] thetaValue = new double[PostureList.Count()]; 

    // This syntax gives an error: 
    // Error 1 'System.Collections.Generic.List<TestNameSpace.Test.PostureStruct>' 
    // does not contain a definition for 'x' and no extension method 'x' accepting a first 
    // argument of type 'System.Collections.Generic.List<TestNameSpace.Test.PostureStruct>' 
    // could be found (are you missing a using directive or an assembly reference?) 
    xValue = PostureList.x.ToArray(); 
    yValue = PostureList.y.ToArray(); 
    thetaValue = PostureList.theta.ToArray(); 

    // I could replace the statements above with something like this but I was wondering if 
    // if there was a better way or if I had some basic mistake in the ToArray() syntax. 
    for (int i = 0; i < PostureList.Count(); i++) 
    { 
     xValue[i] = PostureList[i].x; 
     yValue[i] = PostureList[i].y; 
     thetaValue[i] = PostureList[i].theta; 
    } 

    return; 
} 

回答

2

ToArray擴展方法只能在IEnumerable上使用。要將轉換爲IEnumerable,例如從您的結構到單個值,可以使用Select擴展方法。

var xValues = PostureList.Select(item => item.x).ToArray(); 
var yValues = PostureList.Select(item => item.y).ToArray(); 
var thetaValues = PostureList.Select(item => item.theta).ToArray(); 

你不需要用new定義數組的大小或創建它們,擴展方法將採取照顧。

0

您試圖直接在列表中引用x。

PostureList.y 

你需要做的是在特定成員像

PostureList[0].y 

我猜你需要從你的列表中選擇所有的X。對於你能做到這一點

xValue = PostureList.Select(x => x.x).ToArray(); 
0

您可以用這種方式來您List<PostureStruct>轉換爲單個陣列:

double[] xValue = PostureList.Select(a => a.x).ToArray(); 
double[] yValue = PostureList.Select(a => a.y).ToArray(); 
double[] thetaValue = PostureList.Select(a => a.theta).ToArray(); 

這是你必須做的,該陣列纔會有正確的尺寸(同作爲名單的長度)。

0

您可以循環通過列表:

double[] xValue = new double[PostureList.Count()]; 
    double[] yValue = new double[PostureList.Count()]; 
    double[] thetaValue = new double[PostureList.Count()]; 

    foreach (int i = 0; i < PostureList.Count; ++i) { 
    xValue[i] = PostureList[i].x; 
    yValue[i] = PostureList[i].y; 
    thetaValue[i] = PostureList[i].theta; 
    } 

    ... 

或者使用的LINQ,但在不同方式:

double[] xValue = PostureList.Select(item => item.x).ToArray(); 
    double[] yValue = PostureList.Select(item => item.y).ToArray(); 
    double[] thetaValue = PostureList.Select(item => item.theta).ToArray(); 
    ...