[C#] LINQ의 List에서 항목을 찾으십니까?

다음은 문자열 목록에서 항목을 찾는 간단한 예입니다. 일반적으로 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를 사용하여 목록에서 항목을 찾을 수 있는지 궁금합니다. 가능하다면 어떻게?



답변

몇 가지 방법이 있습니다 ( 전체 목록 이 아님 ).

1) Single 은 단일 결과를 반환하지만 하나 이상을 찾지 못하면 예외를 throw합니다 (원하는 결과 일 수도 있고 아닐 수도 있음).

string search = "lookforme";
List<string> myList = new List<string>();
string result = myList.Single(s => s == search);

참고 SingleOrDefault()는 예외를 throw하는 대신 참조 유형의 경우 null을 반환하거나 값 유형의 기본값을 반환한다는 점을 제외하고는 동일하게 작동합니다.

2) 어디에서 기준과 일치하는 모든 항목을 반환하므로 하나의 요소로 IEnumerable을 얻을 수 있습니다.

IEnumerable<string> results = myList.Where(s => s == search);

3) 먼저 기준과 일치하는 첫 번째 항목을 반환합니다.

string result = myList.First(s => s == search);

참고 FirstOrDefault()는 예외를 throw하는 대신 참조 유형의 경우 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();

첫 패스에서는 람다를 제거 할 수 없습니다.

아이템이 존재하지 않으면 던질 것입니다. 이것은 nullable 정수에 의지하여 문제를 해결합니다.

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 ?? Enumerable.Empty<string>())대신 사용하십시오 list.

의견에 도움을 준 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


답변

필자가 원할 때 정확히 원하는 것을 제공하는 일종의 색인 목록 인 Dictionary를 사용했습니다.

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

따라서 수행중인 작업에 따라 사전이 유용 할 수 있습니다.