web-dev-qa-db-ja.com

LINQによるリストでアイテムを見つけますか?

ここでは、文字列のリストから項目を見つける簡単な例を示します。通常、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を使用してリスト内の項目を検索できるかどうかに興味がありますか?可能ならどうですか?

203
David.Chu.ca

いくつかの方法があります(これは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、値型の場合はデフォルト値を返す点を除いて同じように動作します。

439
Rex M

あなたが要素のインデックスが欲しいなら、これはそれをするでしょう:

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に感謝します。

70

もしそれが本当に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));
}
13
AgileJon

あなたはリストの中の項目と実際の項目のどちらが欲しいですか(項目自体を仮定します)。

ここにあなたのためのたくさんのオプションがあります:

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);
10
Kelsey

この方法は簡単で安全です

var lOrders = new List<string>();

bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false

6
RckLN

IndexOf はどうですか。

指定されたオブジェクトを検索し、リスト内で最初に出現したインデックスを返します

例えば

> var boys = new List<string>{"Harry", "Ron", "Neville"};  
> boys.IndexOf("Neville")  
2
> boys[2] == "Neville"
True

値がリストに現れない場合は-1を返すことに注意してください。

> boys.IndexOf("Hermione")  
-1
5
Colonel Panic

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

2
brinch

私は辞書を使いました。それは私が欲しいときに欲しいものを正確に与えてくれるある種の索引付きリストです。

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"];

ですから、あなたがしていることによっては、辞書が役に立つことがあります。

2

リストから要素を見つける必要がある場合は、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); 
1

これはあなたのLinqリスト検索で最初のあるいはデフォルト値を得るのに役立ちます。

var results = _List.Where(item => item == search).FirstOrDefault();

この検索で​​は、最初に返される値またはデフォルト値が検索されます。

1
user1407955

このコードを試してください:

return context.EntitytableName.AsEnumerable().Find(p => p.LoginID.Equals(loginID) && p.Password.Equals(password)).Select(p => new ModelTableName{ FirstName = p.FirstName, UserID = p.UserID });
1
Nayeem Mansoori

オブジェクトリストでオブジェクトを検索したい

これはあなたのLinqリスト検索で最初のあるいはデフォルト値を得るのにあなたを助けるでしょう。

var item = list.FirstOrDefault(items =>  items.Reference == ent.BackToBackExternalReferenceId);

または

var item = (from items in list
    where items.Reference == ent.BackToBackExternalReferenceId
    select items).FirstOrDefault();
0
Huseyin Durmus