Два разных типа данных в цикле foreach - PullRequest
1 голос
/ 26 апреля 2019

В настоящее время я программирую приложение, используя Entity Framework и LINQ. Ниже я создал метод CarsRow, который присваивает различные результаты свойствам. Затем список заполняется с помощью цикла foreach.

В настоящее время все работает только с одним параметром (в данном случае Cars).

Проблема: как включить второй параметр (тип данных), а затем заполнить им список carList. Например, класс Colors. В конце должна быть создана таблица Excel, содержащая данные из разных классов EF.

private void Main()
{
    var rows = new List<ObjectContactsRow>();

    List<Cars> carList = new List<Cars>();

    carList = _ctx.Objekte.OrderBy(p => p.Nummer).ToList();

    //how can i integrate the data of class Colors in the loop together with the class Cars   

    foreach (var cars in carList)
    {
        var line = rows.Any() ? rows.Max(p => p.LineNumber) + 1 : 2;
        var newrow = CreateNewRow(cars, "parameter of type Colors", line);
        rows.Add(newrow);
    }

    CreateExcelFile(rows);
}

private CarsRow CreateNewRow(Cars obj, Colors col, int line)
{
    var objCars = obj.Cars;
    var colColor = col.Colors;

    return new CarsRow(line)
    {
        Cars = objCars,
        Colors = colColor,
    };
}

1 Ответ

1 голос
/ 26 апреля 2019

Звучит так, как вы хотите Декартово произведение из всех Car с со всеми Color с как ValueTuple<Car,Color>.

Для создания декартового произведения из любых двух списковFoo и Bar в Linq делают это:

// (This approach uses the extension method syntax instead of the C# keywords `from`, `join`, etc)
// Type names have been added to lambda functions to make it obvious what the values are.

IEnumerable<Foo> fooValues = ...
IEnumerable<Bar> barValues = ...

IEnumerable< ( Foo, Bar ) > cartesianProduct = fooValues
    .SelectMany( Foo foo => barValues, ( Foo foo, Bar bar ) => /* the following syntax creates a new ValueTuple in C# 7: */ ( foo, bar ) );

// or more succinctly (removing unnecessary type names):
var cartesianProduct = fooValues
    .SelectMany( foo => barValues, ( foo, bar ) => ( foo, bar ) );

В вашем случае:

List<Car> cars = _ctx.Objekte
    .OrderBy( c => c.Nummer )
    .ToList();

List<Color> colors = // (you haven't shown how you get a List<Color>)

IEnumerable<(Car,Color)> cartesianProduct = cars
    .SelectMany( c => colors, ( car, color ) => ( car, color ) );

Затем вы можете итерировать по cartesianProduct напрямую - но я не думаю,вам нужно, потому что ваш CarsRow объект идентичен (Car,Color) ValueTuple объекту, но если вы хотите выполнить дополнительную обработку, вы можете сделать это:

foreach( (Car car, Color color) in cartesianProduct )
{
    // do stuff with `car` and `color`
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...