MVC3 C#.Net Webアプリがあります。以下の文字列配列があります。
public static string[] HeaderNamesWbs = new[]
{
WBS_NUMBER,
BOE_TITLE,
SOW_DESCRIPTION,
HARRIS_WIN_THEME,
COST_BOGEY
};
別のループにいるときに、特定のエントリのインデックスを検索したい。リストにはIndexOfがあると思いました。見つかりません。何か案は?
さてあなたはArray.IndexOf
を使うことができます:
int index = Array.IndexOf(HeaderNamesWbs, someValue);
または、代わりにHeaderNamesWbs
をIList<string>
として宣言します。必要に応じて、配列にすることもできます。
public static IList<string> HeaderNamesWbs = new[] { ... };
配列をpublic static
、_public static readonly
として公開することはお勧めしません。 ReadOnlyCollection
を検討する必要があります:
public static readonly ReadOnlyCollection<string> HeaderNamesWbs =
new List<string> { ... }.AsReadOnly();
IEnumerable<T>
にこれが必要な場合は、次のように使用できます。
var indexOf = collection.Select((value, index) => new { value, index })
.Where(pair => pair.value == targetValue)
.Select(pair => pair.index + 1)
.FirstOrDefault() - 1;
(+1と-1は、「欠落」に対して0ではなく-1を返すようにするためです。)
ここのスレッドに遅れました。しかし、私はこれに対する私の解決策を共有したいと思いました。 Jonは素晴らしいですが、私はすべてに対して単純なラムダを好みます。
LINQ自体を拡張して、必要なものを取得できます。それを行うのはかなり簡単です。これにより、次のような構文を使用できます。
// Gets the index of the customer with the Id of 16.
var index = Customers.IndexOf(cust => cust.Id == 16);
これは列挙を必要とするため、デフォルトではLINQの一部ではない可能性があります。それは単に別の遅延セレクター/述語ではありません。
また、これは最初のインデックスのみを返すことに注意してください。インデックス(複数)が必要な場合は、メソッド内でIEnumerable<int>
およびyeild return index
を返す必要があります。そしてもちろん-1を返しません。これは、主キーでフィルタリングしない場合に役立ちます。
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;
}
正しいList
にはIndexOf()があり、ILIst<string>
ではなく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);
アイテム値を指定するのではなく関数でリストを検索する場合は、List.FindIndex(述語一致)を使用できます。
https://msdn.Microsoft.com/en-us/library/x1xzf2ca%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 を参照してください