Я застрял в проблеме, когда мне нужно преобразовать список в 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; }
}
Ожидаемый результат
🤔 А знаете ли вы, что...
C# поддерживает событийно-ориентированное программирование с помощью ключевых слов event и delegate.
Вы пытаетесь сделать запись в итерации. 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; }
}