none
Wie zwei verschachtelte for-Schleifen durch LINQ-Ausdruck ersetzen? RRS feed

  • Frage

  • Hallo,
    nochmals eine Frage zu LINQ.
    Ich will in einem DataGridView ermitteln, welche Zellen selektiert sind und dies nach dem Prinzip:
    erst alle Zeilen (beginnend mit dem kleinsten Zeilenindex) und den darin enthaltenen Spalten (beginnend mit dem kleinsten Zeilenindex) durchlaufen.
    Für die weitere Funktionalität ist dies wichtig. Die folgenden beiden for-Schleifen erzeugen genau
    das gewünschte Resultat.
    Mit dataGridView.SelectedCells erhalte ich auch die selektierten Zellen, aber in einer beliebigen Reihenfolge.
    Deshalb nutze ich dies nicht.

    Wie kann ich diese beiden verschachtelten for-Schleifen durch einen einen LINQ-Ausdruck ersetzen und erhalte die Ergebnisse in einer Liste? 


          List<string> cells = new List<string>();

          for (int r = 0; r < dataGridView.Rows.Count; r++)
          {
            for (int c = 0; c < dataGridView.Columns.Count; c++)
            {
              // if user selected cell
              if (dataGridView.Rows[r].Cells[c].Selected == true)
              {
                Console.WriteLine("Zeile: {0}    Spalte: {1}", dataGridView.Rows[r].Index, dataGridView.Columns[c].Index);
                cells.Add(String.Format("{0},{1}", dataGridView.Rows[r].Index, dataGridView.Columns[c].Index));
              }
            }
          }


    List<string> cells = dataGridView.Rows.Cast<DataGridViewRow>().Where( ???

     

    Alexander

    Sonntag, 13. November 2011 11:33

Antworten

  • List<string> cells =

      (from row in dataGridView.Rows.Cast<DataGridViewRow>()

      from cell in row.Cells.Cast<DataGridViewCell>()

      where cell.Selected

      select string.Format("{0},{1}", row.Index, cell.ColumnIndex)).ToList();

     


    MVP Data Platform Development My blog

    • Bearbeitet Martin Honnen Sonntag, 13. November 2011 12:27 Korrektur
    • Als Antwort markiert AlexanderRi Sonntag, 13. November 2011 16:09
    Sonntag, 13. November 2011 12:18

Alle Antworten

  • List<string> cells =

      (from row in dataGridView.Rows.Cast<DataGridViewRow>()

      from cell in row.Cells.Cast<DataGridViewCell>()

      where cell.Selected

      select string.Format("{0},{1}", row.Index, cell.ColumnIndex)).ToList();

     


    MVP Data Platform Development My blog

    • Bearbeitet Martin Honnen Sonntag, 13. November 2011 12:27 Korrektur
    • Als Antwort markiert AlexanderRi Sonntag, 13. November 2011 16:09
    Sonntag, 13. November 2011 12:18
  • Hallo Martin,

    vielen Dank. Funktioniert bestens.

     

    Alexander

    Sonntag, 13. November 2011 16:10
  • Als Anmerkung noch, wenn man die "from"-Variablen typisiert, dann braucht man den Cast<...>-Aufruf nicht, also mit der (ohnehin verwendeten) Query-Syntax ist folgendes etwas kompakter:

    List<string> cells =

      (from DataGridViewRow row in dataGridView.Rows

      from DataGridViewCell cell in row.Cells

      where cell.Selected

      select string.Format("{0},{1}", row.Index, cell.ColumnIndex)).ToList();

     


    MVP Data Platform Development My blog
    Sonntag, 13. November 2011 17:26