数据结构列表列表 - 如何使用linq访问?

时间:2016-11-17 12:13:09

标签: c# linq

我从软件制造商处获得了一个访问文件的c#程序,并给出了一份数据结构列表

<?xml version="1.0" encoding="UTF-8"?>

<?import java.net.URL?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" prefHeight="882.0" prefWidth="1294.0" styleClass="mainFxmlClass" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="admintool.ui.stammdaten.personen.Personen_detailController">
    <stylesheets>
        <URL value="@personen.css" />
    </stylesheets>
   <children>
      <TabPane fx:id="tabPane" prefHeight="882.0" prefWidth="1294.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <tabs>
          <Tab closable="false" text="Details">
            <content>
              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
                     <children>
                        <SplitPane dividerPositions="0.2291421856639248" layoutX="151.0" layoutY="82.0" orientation="VERTICAL" prefHeight="853.0" prefWidth="1294.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                          <items>
                            <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
                                 <children>
                                    <Label layoutX="14.0" layoutY="14.0" text="Name:" />
                                    <Label layoutX="566.0" layoutY="49.0" text="Sperre:" />
                                    <Label layoutX="547.0" layoutY="14.0" text="Person_ID:" />
                                    <TextField fx:id="name_TextFeld_detail" layoutX="66.0" layoutY="10.0" prefHeight="25.0" prefWidth="186.0" />
                                    <Label layoutX="20.0" layoutY="49.0" text="Land:" />
                                    <TextField fx:id="land_TextFeld_detail" layoutX="66.0" layoutY="45.0" prefHeight="25.0" prefWidth="186.0" />
                                    <TextField fx:id="personId_TextFeld_detail" layoutX="620.0" layoutY="10.0" />
                                    <Label layoutX="500.0" layoutY="88.0" text="Windows Kennung:" />
                                    <TextField fx:id="sperre_TextFeld_detail" layoutX="620.0" layoutY="45.0" />
                                    <TextField fx:id="windowsKennung_TextFeld_detail" layoutX="620.0" layoutY="84.0" />
                                 </children>
                              </AnchorPane>
                            <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
                                 <children>
                                    <TableView fx:id="personTable" prefHeight="709.0" prefWidth="1294.0" />
                                 </children>
                              </AnchorPane>
                          </items>
                        </SplitPane>
                     </children>
                  </AnchorPane>
            </content>
          </Tab>
        </tabs>
      </TabPane>
   </children>
</AnchorPane>

这给了我一个“索引”列表,如

List<List<dataPt_struct>> RasterSet = new List<List<dataPt_struct>>();

等等。在那些我有另一个“索引”列表,其中包含实际的数据结构

RasterSet Count = 100
[0]Count = 400
[1]Count = 411   

所以现在我需要访问列表列表中数据结构的X,Y,Z部分。例如,是否可以使用LINQ来说

[0]
   [X] 
   [Y] 
   [Z] 
...
[399]
   [X]
   [Y]
   [Z]

给我一​​个“索引”[0]到[10]中包含的所有Z值的平均值,每个索引都有数百或数千个二级索引,每个索引都有[x] [ y] [z]值?

编辑:我拼凑了一个双重foreach,通过从复杂结构制作一个普通列表,然后在该列表上使用普通linq。我仍然喜欢一气呵成。感谢大家的建议

4 个答案:

答案 0 :(得分:4)

获得总平均值:

var average = RasterSet.SelectMany(x => x).Average(x => x.Z);

要获取索引0-10的子列表的平均值,请执行以下操作:

var average = RasterSet.GetRange(0, 10).SelectMany(x => x).Average(x => x.Z);

答案 1 :(得分:1)

如果我理解你需要什么:

RasterSet.SelectMenu(rs => rs.Take(11)).Average(x => x.Z)

答案 2 :(得分:1)

我建议使用以下代码

RasterSet.Take(10).SelectMany(x => x.Z).Average();

如果要进行分页

,也可以使用Skip()函数

答案 3 :(得分:0)

像这样的东西... ...

var avg = from i in RasterSet
      let innerRasterSet = RasterSet[i]
      where i > 0 && i <= 10
      select innerRasterSet.Average(z=> z.Z);