Как сделать список объектов имея список значений свойств C#
У меня есть следующий список: IEnumerable<KeyValuePair<string, IEnumerable<string>>.
Каждый элемент представляет следующее:
Key - это название свойства (задается атрибутом)
Value - это список значений для этого свойства
Соответственно сам вопрос, как мне сделать N количество объектов со свойствами Value?
Вот код, который я сейчас использую. Он работает частично, значение свойств он устанавливает, но я не знаю как это сделать столько раз, сколько у меня значений свойств.
public static IEnumerable<T> Parse<T>(IList<string> lines) where T : new()
{
PropertyInfo[] props = typeof(T).GetProperties().Where(
x => Attribute.IsDefined(x, typeof(CsvPropertyAttribute))).ToArray();
//Тут 2 элемента Key, в котором Values около 2к элементов
IEnumerable<KeyValuePair<string, IEnumerable<string>> propertyValuesPairs = FormatFile(lines);
var obj = new T();
foreach (var item in propertyValuesPairs)
{
PropertyInfo property = props.FirstOrDefault(
x => x.GetCustomAttribute<CsvPropertyAttribute>().CsvName == item.Key);
property.SetValue(obj, Convert.ChangeType(item.Value[0], property.PropertyType), null);
}
//вернется объект у которого Property1 = item.Value[0], Property2 = item.Value[0]...
return obj;
}
Ответы (2 шт):
var items = from item in propertyValuesPairs
from value in item.Value
select new {item.Key, value};
Тестил следующим образом (использовал лист вместо IEnumerable. Разницы в данном случае не будет):
//заполнение листа
List<string> oneList = new()
{
"10",
"9",
"8",
"7",
"6"
};
List<KeyValuePair<string, List<string>>> propertyValuesPairs = new();
propertyValuesPairs.Add(new KeyValuePair<string, List<string>>("1", oneList.Take(2).ToList()));
propertyValuesPairs.Add(new KeyValuePair<string, List<string>>("2", oneList.Skip(2).Take(3).ToList()));
var items = from item in propertyValuesPairs
from value in item.Value
select new {item.Key, value};
foreach (var item in items)
Console.WriteLine(string.Format(@"Key: {0}. Value: {1}", item.Key, item.value));
Результат:
Оказалось всё проще. Количество элементов в Values всегда будет одинаково для всех свойств в моём случае. Соответственно можно вынести всё внутрь цикла, который будет исполняться столько раз, сколько значений для свойств:
Таким образом, если у меня будет 1000 значений для свойств, то будет сделано 1000 объектов с указанными свойствами (в propertyValuesPairs)
int count = propertyValuesPairs.First().Value.Count;
for (int i = 0; i < count; i++)
{
var obj = new T();
foreach (var item in propertyValuesPairs)
{
PropertyInfo property = props.FirstOrDefault(
x => x.GetCustomAttribute<CsvPropertyAttribute>().CsvName == item.Key);
if (property == null)
continue;
property.SetValue(obj, Convert.ChangeType(item.Value[i], property.PropertyType), null);
}
yield return obj;
}
