ここでは、文字列のリストから項目を見つける簡単な例を示します。通常、forループまたは無名デリゲートを使ってこれを行います。
int GetItemIndex(string search)
{
int found = -1;
if ( _list != null )
{
foreach (string item in _list) // _list is an instance of List<string>
{
found++;
if ( string.Equals(search, item) )
{
break;
}
}
/* use anonymous delegate
string foundItem = _list.Find( delegate(string item) {
found++;
return string.Equals(search, item);
});
*/
}
return found;
}
LINQは私にとって新しいものです。 LINQを使用してリスト内の項目を検索できるかどうかに興味がありますか?可能ならどうですか?
いくつかの方法があります(これはnot完全なリストです)。
1) Single は単一の結果を返しますが、それ以上も見つからない場合は例外をスローします。 1つより多い(これはあなたが望むものであってもなくてもよいです):
string search = "lookforme";
List<string> myList = new List<string>();
string result = myList.Single(s => s == search);
注意SingleOrDefault()
は、例外をスローするのではなく、参照型の場合はnull、値型の場合はデフォルト値を返す点を除いて同じように動作します。
2) ここで は条件に一致するすべての項目を返すので、IEnumerableは1で得られます。素子:
IEnumerable<string> results = myList.Where(s => s == search);
3) First は、条件に一致する最初の項目を返します。
string result = myList.First(s => s == search);
注意FirstOrDefault()
は、例外をスローするのではなく、参照型の場合はnull、値型の場合はデフォルト値を返す点を除いて同じように動作します。
あなたが要素のインデックスが欲しいなら、これはそれをするでしょう:
int index = list.Select((item, i) => new { Item = item, Index = i })
.First(x => x.Item == search).Index;
// or
var tagged = list.Select((item, i) => new { Item = item, Index = i });
int index = (from pair in tagged
where pair.Item == search
select pair.Index).First();
あなたは最初のパスでラムダを取り除くことはできません。
アイテムが存在しない場合はこれがスローされることに注意してください。これは、null許容整数に頼ることで問題を解決します。
var tagged = list.Select((item, i) => new { Item = item, Index = (int?)i });
int? index = (from pair in tagged
where pair.Item == search
select pair.Index).FirstOrDefault();
あなたがアイテムが欲しいならば:
// Throws if not found
var item = list.First(item => item == search);
// or
var item = (from item in list
where item == search
select item).First();
// Null if not found
var item = list.FirstOrDefault(item => item == search);
// or
var item = (from item in list
where item == search
select item).FirstOrDefault();
一致するアイテムの数を数えたい場合は、
int count = list.Count(item => item == search);
// or
int count = (from item in list
where item == search
select item).Count();
あなたが一致するすべてのアイテムが欲しいならば:
var items = list.Where(item => item == search);
// or
var items = from item in list
where item == search
select item;
そして、これらのいずれの場合もnull
のリストをチェックすることを忘れないでください。
あるいはlist
の代わりに(list ?? Enumerable.Empty<string>())
を使用してください。
コメントを手伝ってくれてPavelに感謝します。
もしそれが本当にList<string>
であれば、LINQは必要ありません、単に使用してください:
int GetItemIndex(string search)
{
return _list == null ? -1 : _list.IndexOf(search);
}
アイテム自体を探しているなら、試してみてください。
string GetItem(string search)
{
return _list == null ? null : _list.FirstOrDefault(s => s.Equals(search));
}
あなたはリストの中の項目と実際の項目のどちらが欲しいですか(項目自体を仮定します)。
ここにあなたのためのたくさんのオプションがあります:
string result = _list.First(s => s == search);
string result = (from s in _list
where s == search
select s).Single();
string result = _list.Find(search);
int result = _list.IndexOf(search);
この方法は簡単で安全です
var lOrders = new List<string>();
bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false
IndexOf
はどうですか。
指定されたオブジェクトを検索し、リスト内で最初に出現したインデックスを返します
例えば
> var boys = new List<string>{"Harry", "Ron", "Neville"};
> boys.IndexOf("Neville")
2
> boys[2] == "Neville"
True
値がリストに現れない場合は-1を返すことに注意してください。
> boys.IndexOf("Hermione")
-1
LINQを使用するようにメソッドを書き直す1つの方法があります。
public static int GetItemIndex(string search)
{
List<string> _list = new List<string>() { "one", "two", "three" };
var result = _list.Select((Value, Index) => new { Value, Index })
.SingleOrDefault(l => l.Value == search);
return result == null ? -1 : result.Index;
}
したがって、と呼びます。
GetItemIndex("two")
は1
を返します。
そして
GetItemIndex("notthere")
は-1
を返します。
参照: linqsamples.com
私は辞書を使いました。それは私が欲しいときに欲しいものを正確に与えてくれるある種の索引付きリストです。
Dictionary<string, int> margins = new Dictionary<string, int>();
margins.Add("left", 10);
margins.Add("right", 10);
margins.Add("top", 20);
margins.Add("bottom", 30);
例えば、私が自分のマージン値にアクセスしたいときはいつでも、私は自分の辞書に対処します。
int xStartPos = margins["left"];
int xLimitPos = margins["right"];
int yStartPos = margins["top"];
int yLimitPos = margins["bottom"];
ですから、あなたがしていることによっては、辞書が役に立つことがあります。
リストから要素を見つける必要がある場合は、Find
およびFindAll
拡張メソッドを使用できますが、それらにはわずかな違いがあります。これが一例です。
List<int> items = new List<int>() { 10, 9, 8, 4, 8, 7, 8 };
// It will return only one 8 as Find returns only the first occurrence of matched elements.
var result = items.Find(ls => ls == 8);
// this will returns three {8,8,8} as FindAll returns all the matched elements.
var result1 = items.FindAll(ls => ls == 8);
これはあなたのLinqリスト検索で最初のあるいはデフォルト値を得るのに役立ちます。
var results = _List.Where(item => item == search).FirstOrDefault();
この検索では、最初に返される値またはデフォルト値が検索されます。
このコードを試してください:
return context.EntitytableName.AsEnumerable().Find(p => p.LoginID.Equals(loginID) && p.Password.Equals(password)).Select(p => new ModelTableName{ FirstName = p.FirstName, UserID = p.UserID });
オブジェクトリストでオブジェクトを検索したい
これはあなたのLinqリスト検索で最初のあるいはデフォルト値を得るのにあなたを助けるでしょう。
var item = list.FirstOrDefault(items => items.Reference == ent.BackToBackExternalReferenceId);
または
var item = (from items in list
where items.Reference == ent.BackToBackExternalReferenceId
select items).FirstOrDefault();