c# - net - LINQ indexOf una entrada particular
list elements c# (4)
La List
derecha tiene IndexOf (), simplemente declararlo como ILIst<string>
lugar de string[]
public static IList<string> HeaderNamesWbs = new List<string>
{
WBS_NUMBER,
BOE_TITLE,
SOW_DESCRIPTION,
HARRIS_WIN_THEME,
COST_BOGEY
};
int index = HeaderNamesWbs.IndexOf(WBS_NUMBER);
Tengo una aplicación web MVC3 C # .Net. Tengo la siguiente cadena de cadenas.
public static string[] HeaderNamesWbs = new[]
{
WBS_NUMBER,
BOE_TITLE,
SOW_DESCRIPTION,
HARRIS_WIN_THEME,
COST_BOGEY
};
Quiero encontrar el índice de una entrada dada cuando estoy en otro bucle. Pensé que la lista tendría un IndexOf. No puedo encontrarlo ¿Algunas ideas?
Llego tarde al hilo aquí. Pero quería compartir mi solución a esto. Jon es increíble, pero prefiero las lambdas simples para todo.
Puedes extender LINQ para obtener lo que quieras. Es bastante simple de hacer Esto te permitirá usar la sintaxis como:
// Gets the index of the customer with the Id of 16.
var index = Customers.IndexOf(cust => cust.Id == 16);
Es probable que esto no sea parte de LINQ por defecto porque requiere enumeración. No es solo otro selector / predicado diferido.
Además, tenga en cuenta que esto solo devuelve el primer índice. Si desea índices (plural), debe devolver un IEnumerable<int>
y yeild return index
dentro del método. Y por supuesto no vuelvas -1. Eso sería útil cuando no está filtrando por una clave principal.
public static int IndexOf<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
var index = 0;
foreach (var item in source) {
if (predicate.Invoke(item)) {
return index;
}
index++;
}
return -1;
}
Pues puedes usar Array.IndexOf
:
int index = Array.IndexOf(HeaderNamesWbs, someValue);
O simplemente declare HeaderNamesWbs
como IList<string>
lugar, que aún puede ser una matriz si desea:
public static IList<string> HeaderNamesWbs = new[] { ... };
Tenga en cuenta que le desalentaría que exponga una matriz como public static
, incluso public static readonly
. Debes considerar ReadOnlyCollection
:
public static readonly ReadOnlyCollection<string> HeaderNamesWbs =
new List<string> { ... }.AsReadOnly();
Si alguna vez quieres esto para IEnumerable<T>
, puedes usar:
var indexOf = collection.Select((value, index) => new { value, index })
.Where(pair => pair.value == targetValue)
.Select(pair => pair.index + 1)
.FirstOrDefault() - 1;
(Los +1 y -1 son para que devuelva -1 para "faltantes" en lugar de 0.)
Si desea buscar en la Lista con una función en lugar de especificar un valor de elemento, puede usar List.FindIndex (coincidencia de predicado).
Consulte https://msdn.microsoft.com/en-us/library/x1xzf2ca%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396