Ответ 1
Как насчет string.Join вместо foreach
(он даже решает запятую после последней проблемы с элементом):
@String.Join(", ", Model.People.Select(p => p.Name).ToArray())
У меня есть следующий шаблон html бритвы, хотя я не могу понять, как включить запятую для разделения имен в разметке!? При попытке выполнить следующий код я получаю ; expected
как ошибку компилятора!. Мне также нужно удалить последнюю запятую.
@foreach (People person in Model.People)
{
person.Name,
}
Я хочу: Тед, Джеймс, Дженни, Том
Как насчет string.Join вместо foreach
(он даже решает запятую после последней проблемы с элементом):
@String.Join(", ", Model.People.Select(p => p.Name).ToArray())
Вы можете использовать <text></text>
для включения литерала в шаблон Razor. Чтобы опустить последнюю запятую, я использовал бы цикл for
, а не foreach
.
@{
var peopleList = Model.People.ToList();
for( int i = 0; i < peopleList.Count; i++ )
{
@peopleList[i].Name
if( i < peopleList[i].Count - 1 )
{
<text>,</text>
}
}
}
Как указывает @nemesv, если все, что вы делаете, это создание и отображение строки с разделителями, string.Join()
- более чистый способ выполнить это. Если вы создаете более сложную разметку, вам, вероятно, понадобится использовать цикл.
Вы можете добиться результата в компактном режиме, используя тернарный оператор
@foreach (People person in Model.People)
{
@[email protected]((person != Model.People.Last()) ? "," : "")
}
Попробуйте что-нибудь вроде
@foreach (People person in Model.People)
{
@person.Name<text>,</text>
}
@foreach (People person in Model.People)
{
person.Name<text>, </text>
}
или лучше:
string.Join(", ", Model.People.Select(x => x.Name).ToArray())
Попробуйте следующее:
bool firstIteration = true
@foreach (People person in Model.People)
{
if(firstIteration)
{
@: person.Name
}
else
{
@: "," + person.Name
}
firstIteration = false;
}
Идея для сценария, где вам нужно делать дополнительные "вещи" в цикле foreach, а не просто отображать дисплей.
// index.cshtml
@{ var lastPerson = Model.People.LastOrDefault(); }
@foreach (People person in Model.People)
{
var display = person != lastPerson ? $"{person.Name}, " : person.Name;
<a href="@person.Href">@display</a>
}
Или, если вы похожи на меня, и вы хотите попытаться сохранить логику сравнения и разбора из представления, вы можете написать простой метод расширения.
// StringExtensions.cs
public class StringExtensions
{
public static string DisplayAsCommaListItem(
this string str, object currentItem, object lastItem)
{
return currentItem != lastItem ? $"{str}, " : str;
}
}
Тогда код вида будет...
// index.cshtml
@{ var lastPerson = Model.People.LastOrDefault(); }
@foreach (People person in Model.People)
{
<a href="@person.Href">@person.Name.DisplayAsCommaListItem(person, lastPerson)</a>
}