Цикл по вложенному списку - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть следующий список в модели:

public List<List<SalesLineDto>> SalesLines { get; set; }

Dto выглядит следующим образом:

public class SalesLineDto
{
    public long AgentSalesLineId { get; set; }
    public long? SalesLineId { get; set; }
    public string Label { get; set; }
    public long? OptionId { get; set; } 
    public double? Quoted { get; set; }
    public string SelectedCurrency { get; set; }
    public long? SelectedPricingMethod { get; set; }
    public long? ComplementaryServiceId { get; set; }
    public string IsOther { get; set; }
}

Запрос, возвращающий вложенный список, выглядит следующим образом:

return query.GroupBy(u => u.SalesLineId).Select(grp => grp.ToList()).ToList();

Я делаю группировку по SalesLineId.

В моем cshtml мне нужно пройти через вложенный список. У меня есть следующий код:

@for (var k = 0; k < Model.ListTransport[i].SalesLines.Count; k++)
{
    <div class="form-control-group">
        <div class="form-control form-control--third-width">
            <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
                @Html.EditorFor(Model => Model.ListTransport[i].SalesLines[k].FirstOrDefault().Label, new { htmlAttributes = new { @class = "mdl-textfield__input", @maxlength = "150", @readonly = "readonly" } })
            </div>
        </div>


            <div class="form-control form-control--combo form-control--third-width">

                @{ var options = Model.ListTransport[i].ListOptions; }
                @for (int j = 0; j < options.Count; j++)
                {
                    @Html.HiddenFor(model => model.ListTransport[i].ListOptions[j].Id)
                    <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
                        <span class="label label--floating text-right">@WebMVCStrings.Option @options[j].OptionId</span>
                        @Html.EditorFor(model => model.ListTransport[i].SalesLines[k].ElementAtOrDefault(j).Quoted, new { htmlAttributes = new { @class = "mdl-textfield__input text-right", @maxlength = "150" } })
                        <label class="mdl-textfield__label text-right" for="metricsServiceOption1">@options[j].OptionValue @options[j].OptionUnit</label>
                    </div>
                }
            </div>

        <div class="form-control form-control--combo form-control--third-width">
            <div class="mdl-textfield mdl-textfield--floating-label js-dropdown">
                @(Html.EJ().DropDownListFor(model => model.ListTransport[i].SalesLines[k].ElementAtOrDefault(0).SelectedCurrency)
                .Datasource((List<KeyValuePair>)ViewBag.ListCurrencies)
                .DropDownListFields(Currency => Currency.Text("Value").Value("Value"))
                .EnableFilterSearch(true)
                .FilterType(SearchFilterType.Contains)
                .PopupHeight("300px")
                .ClientSideEvents(ev => ev.Change("updateCurrency"))
                .CssClass("currencyValue" + Model.ListTransport[i].ModOfTransportId))
                <label class="mdl-textfield__label" for="SelectedCurrency">@WebMVCStrings.Currency</label>
            </div>

            <div class="mdl-textfield mdl-textfield--floating-label js-dropdown">
                @(Html.EJ().DropDownListFor(model => model.ListTransport[i].SalesLines[k].FirstOrDefault().SelectedPricingMethod)
                .Datasource((List<KeyValuePair>)ViewBag.ListBillingUnits)
                .DropDownListFields(BillingUnit => BillingUnit.Text("Value").Value("Key"))
                .EnableFilterSearch(true)
                .FilterType(SearchFilterType.Contains)
                .PopupHeight("300px")
                .ClientSideEvents(ev => ev.Change("updateBillingUnit"))
                .CssClass("billingUnitValue"))
                <label class="mdl-textfield__label" for="SelectedCurrency">@WebMVCStrings.BillingUnit</label>
            </div>
        </div>
    </div>
}

Однако у меня возникли проблемы с циклическим повторением второго списка.
Когда я делаю model.ListTransport [i] .SalesLines [k], я не могу получить прямой доступ к вложенному списку.
Есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Вы можете использовать SelectMany из LINQ , этот ответ объясняет, как это работает

var salesLineDtos = SalesLines.SelectMany(sl => sl);
foreach (var salesLineDto in salesLineDtos)
{
    Console.WriteLine(salesLineDto.AgentSalesLineId);
    // Access other properties
}
0 голосов
/ 01 апреля 2019
 Model.ListTransport[i].SalesLines[j][k]

Список списков (List<List<>>) похож на двумерный массив.В моем примере k - это итератор во вложенном списке.

...