c# - sujeto - Sintaxis simple de plantillas de afeitar para incluir una coma para separar los nombres
sintaxis de oraciones explicacion (7)
¿Qué pasa con string.Join en lugar de foreach
(incluso resuelve la coma después del último problema del elemento):
@String.Join(", ", Model.People.Select(p => p.Name).ToArray())
Tengo la siguiente plantilla de afeitar html, ¡aunque no sé cómo incluir una coma para separar los nombres dentro del marcado !? Cuando intento el siguiente código, obtengo ; expected
como un error de compilador !. También necesitaré quitar la última coma también.
@foreach (People person in Model.People)
{
person.Name,
}
Quiero: Ted, James, Jenny, Tom
Podría lograr el resultado de una forma compacta utilizando un operador ternario
@foreach (People person in Model.People)
{
@person.Name@((person != Model.People.Last()) ? "," : "")
}
Prueba esto:
bool firstIteration = true
@foreach (People person in Model.People)
{
if(firstIteration)
{
@: person.Name
}
else
{
@: "," + person.Name
}
firstIteration = false;
}
Pruebe algo como
@foreach (People person in Model.People)
{
@person.Name<text>,</text>
}
Puede usar <text></text>
para incluir contenido literal en una plantilla Razor. Para omitir la última coma, usaría un ciclo for
lugar de 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>
}
}
}
Como señala @nemesv, si todo lo que estás haciendo es crear y mostrar una cadena delimitada, string.Join()
es una forma más limpia de lograr esto. Si está creando un marcado más complejo, probablemente necesite usar un bucle.
Una idea para un escenario en el que necesita hacer "cosas" adicionales en el ciclo foreach que solo renderizar la pantalla.
// 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>
}
O si eres como yo y quieres tratar de mantener la comparación y la lógica de análisis fuera de la vista, puedes escribir un método de extensión simple.
// StringExtensions.cs
public class StringExtensions
{
public static string DisplayAsCommaListItem(
this string str, object currentItem, object lastItem)
{
return currentItem != lastItem ? $"{str}, " : str;
}
}
Entonces el código de vista se convierte en ..
// index.cshtml
@{ var lastPerson = Model.People.LastOrDefault(); }
@foreach (People person in Model.People)
{
<a href="@person.Href">@person.Name.DisplayAsCommaListItem(person, lastPerson)</a>
}
@foreach (People person in Model.People)
{
person.Name<text>, </text>
}
o mejor:
string.Join(", ", Model.People.Select(x => x.Name).ToArray())