Как сделать список объектов имея список значений свойств 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 шт):

Автор решения: Frehzy
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));

Результат:

введите сюда описание изображения

→ Ссылка
Автор решения: Aarnihauta

Оказалось всё проще. Количество элементов в 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;
}        
→ Ссылка