dlnzki Ответов: 2

Как отобразить данные в табличном формате для C# MVC


Привет, я все еще новичок в c# и нуждаюсь в помощи в отображении данных.

вот чего я хочу:
<tr><th>Column 1 </th> <td> UnitName1</td>   <td>UnitName2 </td></tr>
<tr><th>Column 2</th>  <td> UnitName3</td>   <td>UnitName4 </td></tr>

я перечислил все названия блоков в домашнем контроллере вот так:

private List<Units> Unit;
        public HomeController()
        {
            ViewBag.UnitName = Unit;

            Unit = new List<Units>()
            {
                new Units() {UnitName = "UnitName1"},
                new Units() {UnitName = "UnitName2"},
                new Units() {UnitName = "UnitName3"},
                new Units() {UnitName = "UnitName4"},
                new Units() {UnitName = "UnitName5"},
                new Units() {UnitName = "UnitName6"},
           }; 


я не знаю, как отобразить данные с помощью оператора if, потому что мне нужно только 2 имени блока в строке.

Что я уже пробовал:

это код в моем cshtml, который я пробовал:

@foreach (var d in Model)
    {
        <tr>
            <td>d.UnitName</td>
        </tr>
    }


этот код верен, поскольку он выполняет имя единицы измерения, но в одном столбце.
могу ли я по-прежнему использовать оператор "foreach" для достижения желаемого? спасибо :)

2 Ответов

Рейтинг:
2

Maciej Los

Если вы хотите отобразить 2 единицы измерения в одной строке, вы должны создать Tuple<Unit, Unit>:

var UnitPairs =  Units
    .Select((u, i) => Tuple.Create(i, u)).Where(x=>x.Item1%2==0)
    .Join(Units.Select((u, i)  => Tuple.Create(i, u)).Where(x=>x.Item1%2!=0),
        left => left.Item1 +1,
        right => right.Item1,
        (left, right) => new { Left = left, Right = right })
    .Select(x=> Tuple.Create(x.Left.Item2, x.Right.Item2));

затем...
@foreach(Tuple<Unit, Unit> up in UnitPairs)
{
      <tr>
        <td>up.Item1.UnitName</td>
        <td>up.Item2.UnitName</td>
      <tr>
}


Рейтинг:
0

Richard Deeming

Нет необходимости в кортежах; просто используйте вложенный for петля:

@for (int i = 0; i < Model.Count; i += 2)
{
    <tr>
        <th scope="row">...</th>
        @for (int j = i; j < 2 && j < Model.Count; j++)
        {
            <td>@Model[j].UnitName</td>
        }
    </tr>
}


Maciej Los

5ed!
Это была моя первая мысль. Наконец, я решил использовать Кортеж.

Richard Deeming

Другой моей мыслью был кортеж с GroupBy:

IEnumerable<IGrouping<int, Unit>> groupedUnits = Units
    .Select((u, i) => Tuple.Create(i, u))
    .GroupBy(t => t.Item1 / 2, t => t.Item2);
@foreach (IGrouping<int, Unit> group in groupedUnits)
{
    <tr>
        <th>...</th>
        @foreach (Unit unit in group)
        {
            <td>@unit.UnitName</td>
        }
    </tr>
}
:)

Maciej Los

Очень хорошая реализация. Выглядит гораздо лучше, чем моя.