Работа с Dictionary в c# — как получить данные в массиве?

Друзья, я не знаю c# настолько глубоко, поэтому вынужден обратиться за помощью.

Использую чужой класс который мне не понятен, но мне нужен это функционал.

При выборке данных их sqlite применяется

public DataTable ExecuteQuery(string query)
    {
        if (!IsConnectionOpen)
        {
            throw new SqliteException("SQLite database is not open.");
        }
        
        IntPtr stmHandle = Prepare(query);
 
        int columnCount = sqlite3_column_count(stmHandle);
 
        var dataTable = new DataTable();
        for (int i = 0; i < columnCount; i++)
        {
            string columnName = Marshal.PtrToStringAnsi(sqlite3_column_name(stmHandle, i));
            dataTable.Columns.Add(columnName);
        }
        
        //populate datatable
        while (sqlite3_step(stmHandle) == SQLITE_ROW)
        {
            object[] row = new object[columnCount];
            for (int i = 0; i < columnCount; i++)
            {
                switch (sqlite3_column_type(stmHandle, i))
                {
                    case SQLITE_INTEGER:
                        row[i] = sqlite3_column_int(stmHandle, i);
                        break;
                
                    case SQLITE_TEXT:
                        IntPtr text = sqlite3_column_text(stmHandle, i);
                        row[i] = Marshal.PtrToStringAnsi(text);
                        break;

                    case SQLITE_FLOAT:
                        row[i] = sqlite3_column_double(stmHandle, i);
                        break;
                    
                    case SQLITE_NULL:
                        row[i] = null;
                        break;
                }
            }
        
            dataTable.AddRow(row);
        }
        
        Finalize(stmHandle);
        
        return dataTable;
    }


Далее привожу код DataTable и DataRow

public class DataRow : Dictionary<string, object>
{
    public new object this[string column]
    {
        get
        {
            if (ContainsKey(column))
            {
                return base[column];
            }
            
            return null;
        }
        set
        {
            if (ContainsKey(column))
            {
                base[column] = value;
            }
            else
            {
                Add(column, value);
            }
        }
    }
}

public class DataTable
{
    public DataTable()
    {
        Columns = new List<string>();
        Rows = new List<DataRow>();
    }
    
    public List<string> Columns { get; set; }
    public List<DataRow> Rows { get; set; }
    
    public DataRow this[int row]
    {
        get
        {
            return Rows[row];
        }
    }
    
    public void AddRow(object[] values)
    {
        if (values.Length != Columns.Count)
        {
            throw new IndexOutOfRangeException("The number of values in the row must match the number of column");
        }
        
        var row = new DataRow();
        for (int i = 0; i < values.Length; i++)
        {
            row[Columns[i]] = values[i];
        }
        
        Rows.Add(row);
    }
}


Как мне в цикле получить все данные из DataTable?

Если по строкам то могу так dataTable.[0]["db_field_index"]

Но как в массиве все данные получить?
  • Вопрос задан
  • 6540 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AlexP11223
Использовали бы лучше SQLite провайдера для стандартного ADO.NET, например https://system.data.sqlite.org

Как мне в цикле получить все данные из DataTable?

У Dictionary можно получить массив значений через Values. Или массив KeyValuePair через ToArray(), ToList() или просто цикл foreach.

То есть видимо например как-то так:
for (int i = 0; i < dt.Rows.Count; i++)
{
    foreach (var value in dt.Rows[i].Values)
    {
        //Console.WriteLine(value);
    }
}


Порядок значений в Values не гарантирован (но такой же как и у ключей Keys), то есть может отличаться от того, как у вас было в таблице БД.
Так что вероятно больше смысла делать что-то типа такого:
for (int i = 0; i < dt.Rows.Count; i++)
{
    foreach (var kv in dt.Rows[i])
    {
        //Console.WriteLine("Column: " + kv.Key + ", value: " + kv.Value);
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы