Список значений имен в словарь для импорта в MongoDB

Я застрял в проблеме, когда мне нужно преобразовать список в Dictionary> BsonDocument для импорта в MongoDB.

В списке есть имя столбца и значения для вставки в этот столбец. Но я получаю, что ключ уже выходит из исключения, как только компилятор входит в цикл. Любое предложение?

void Main()
{
    List<ListRow> myList = new List<ListRow>();
    myList.Add(new ListRow { columnName = "column1", results = new List<string> { "a1", "b1", "c1" } });
    myList.Add(new ListRow { columnName = "column2", results = new List<string> { "a2", "b2", "c2" } });
    myList.Add(new ListRow { columnName = "column3", results = new List<string> { "a3", "b3", "c3" } });

    List<BsonDocument> batch = new List<BsonDocument>();
    foreach (var row in myList)
    {
        var dictionary = row.results.ToDictionary(x => row.columnName, x => x);
        batch.Add(dictionary);
    }
    // Print batch
    // Add to MongoDB
}

public class ListRow
{
    public string columnName { get; set; }
    public List<string> results { get; set; }
}

Ожидаемый результат

Список значений имен в словарь для импорта в MongoDB

🤔 А знаете ли вы, что...
C# поддерживает событийно-ориентированное программирование с помощью ключевых слов event и delegate.


1
345
3

Ответы:

Вы пытаетесь сделать запись в итерации. ToDictionary стремится создать целый словарь.

class Program
{
    static void Main(string[] args)
    {
        List<ListRow> myList = new List<ListRow>
        {
            new ListRow {columnName = "column1", results = new List<string> {"a1", "b1", "c1"}},
            new ListRow {columnName = "column2", results = new List<string> {"a2", "b2", "c2"}},
            new ListRow {columnName = "column3", results = new List<string> {"a3", "b3", "c3"}}
        };

        BsonDocument batch = myList.ToDictionary(x => x.columnName, x => x.results).ToBsonDocument();
        // Print batch
        // Add to MongoDB
    }
}

public class ListRow
{
    public string columnName { get; set; }
    public List<string> results { get; set; }
}

Ваш ключ: имя row.columN повторяется, когда список сводится к словарю. Вы можете попробовать сгенерировать уникальный ключ для каждого элемента списка.

    List<BsonDocument> batch = new List<BsonDocument>();
    foreach (var row in myList)
    {
        var i = 0;
        var dictionary = row.results.ToDictionary(x => $"{row.columnName}_{++i}", x => x);
        batch.Add(dictionary);
    }

Решено

В порядке. Если я правильно понимаю задачу, вы хотите сначала транспонировать матрицу

"a1", "b1", "c1"
"a2", "b2", "c2"
"a3", "b3", "c3"

чем назовите столбцы с помощью столбца1, столбца2, столбца3 и т. д. Для проблемы транспонирования я получил это решение.

Оттуда я разработал это решение, где мне нужен корневой узел, который не ясно, как должен выглядеть из вопроса>

class Program
{
    static void Main(string[] args)
    {
        List<ListRow> myList = new List<ListRow>
        {
            new ListRow {columnName = "column1", results = new List<string> {"a1", "b1", "c1"}},
            new ListRow {columnName = "column2", results = new List<string> {"a2", "b2", "c2"}},
            new ListRow {columnName = "column3", results = new List<string> {"a3", "b3", "c3"}}
        };

        var result = myList
            .SelectMany(listRow => listRow.results.Select((item, index) => new {item, index}))
            .GroupBy(i => i.index, i => i.item)
            .Select(g => g.Select((x, index) => new {Col = myList[index].columnName, Value = x})
                .ToDictionary(x => x.Col, x => x.Value))
            .ToList();

        BsonDocument batch = new Dictionary<string, List<Dictionary<string, string>>> {{"root", result}}
            .ToBsonDocument();
        // {{ "root" : [{ "column1" : "a1", "column2" : "a2", "column3" : "a3" }, { "column1" : "b1", "column2" : "b2", "column3" : "b3" }, { "column1" : "c1", "column2" : "c2", "column3" : "c3" }] }}
        // or just
        BsonArray batchPart = BsonArray.Create(result);
        // {[{ "column1" : "a1", "column2" : "a2", "column3" : "a3" }, { "column1" : "b1", "column2" : "b2", "column3" : "b3" }, { "column1" : "c1", "column2" : "c2", "column3" : "c3" }]}
        // Print batch
        // Add to MongoDB
    }
}

public class ListRow
{
    public string columnName { get; set; }
    public List<string> results { get; set; }
}