programing

목록에 문자열이 포함된 요소가 포함되어 있는지 확인하고 해당 요소를 가져옵니다.

closeapi 2023. 4. 21. 20:52
반응형

목록에 문자열이 포함된 요소가 포함되어 있는지 확인하고 해당 요소를 가져옵니다.

이 질문에 대한 답을 찾던 중 LINQ를 사용하여 비슷한 질문을 발견했지만 익숙하지 않아서 완전히 이해하지 못했습니다(그리고 구현).기본적으로 제가 하고 싶은 것은 다음과 같습니다.

  1. 목록의 요소에 특정 문자열이 포함되어 있는지 확인합니다.
  2. 문제가 있는 경우 해당 요소를 가져옵니다.

저는 솔직히 어떻게 해야 할지 모르겠어요.생각해 낼 수 있는 것은, 다음과 같습니다(물론 동작하지 않습니다).

if (myList.Contains(myString))
    string element = myList.ElementAt(myList.IndexOf(myString));

동작하지 않는 이유를 알고 있습니다.

  • myList.Contains() 않다true리스트의 요소 전체가 지정한 문자열과 일치하는지 여부를 체크하기 때문입니다.
  • myList.IndexOf()는 다시 말하지만 문자열과 일치하는 요소를 체크하기 때문에 오카렌스를 찾을 수 없습니다.

아직 이 문제를 어떻게 해결해야 할지 모르겠습니다만, 저와 같은 질문에서 제시한 LINQ를 사용해야 할 것 같습니다.단, 만약 그렇다면 답변자에게 LINQ의 사용 예를 설명해 주셨으면 합니다(말씀 드렸듯이, 저는 C#을 사용하는 동안 신경 쓰지 않았습니다).여러분, 잘 부탁드립니다.

EDIT: 해결 방법을 찾았습니다.목록을 루프하여 현재 요소에 문자열이 포함되어 있는지 확인한 후 현재 요소와 동일한 문자열을 설정합니다.하지만 이것보다 더 효율적인 방법은 없을까?

string myString = "bla";
string element = "";

for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Contains(myString))
        element = myList[i];
}

여기서 Linq를 사용할 수 있습니다.

var matchingvalues = myList
    .Where(stringToCheck => stringToCheck.Contains(myString));

첫 번째 일치하는 아이템을 반품하는 경우:

var match = myList
    .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));

if(match != null)
    //Do stuff

기본적인 대답은 루프를 반복하여 지정된 문자열이 포함된 요소를 확인해야 한다는 것입니다.예를 들어, 코드는 다음과 같습니다.

foreach(string item in myList)
{
    if(item.Contains(myString))
       return item;
}

동일하지만 간결한 코드는 다음과 같습니다.

mylist.Where(x => x.Contains(myString)).FirstOrDefault();

여기서 x는 상기 코드의 "항목"과 같은 역할을 하는 파라미터입니다.

string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
  //found
}
for (int i = 0; i < myList.Length; i++)
{
    if (myList[i].Contains(myString)) // (you use the word "contains". either equals or indexof might be appropriate)
    {
        return i;
    }
}

오래된 패션 루프가 거의 항상 가장 빠릅니다.

문자열을 포함하는 문자열 목록을 원하는 경우:

var newList = myList.Where(x => x.Contains(myString)).ToList();

다른 옵션은 Linq First Or Default를 사용하는 것입니다.

var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();

주의해 주세요Contains메서드는 대소문자를 구분합니다.

Linq의 확장 방법을 사용할 수 있습니다.

string element = myList.FirstOrDefault(s => s.Contains(myString));

하위 문자열이 된 첫 됩니다.myString , 「」null★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

이라면, 「」를 사용해 주세요.List<T>클래스 메서드:

int index = myList.FindIndex(s => s.Contains(myString));

하위 문자열을 포함하는 first 요소의 인덱스를 반환합니다.myString, 또는-1그러한 요소가 발견되지 않는 경우.

여기에서는 좋은 답변이 많이 있습니다만, 저는 다음과 같이 Exists를 사용하여 간단한 답변을 사용합니다.

foreach (var setting in FullList)
{
    if(cleanList.Exists(x => x.ProcedureName == setting.ProcedureName)) 
       setting.IsActive = true; // do you business logic here 
    else
       setting.IsActive = false;
    updateList.Add(setting);
}

다음과 같은 기능을 사용할 수 있어야 합니다. 저는 잘 작동했습니다.

var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));

안맞는 곳을 찾아야 한다면 이런 식으로요.

 var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));

사용할 수 있습니다.

var match=myList.Where(item=>item.Contains("Required String"));
foreach(var i in match)
{
//do something with the matched items
}

LINQ는 모든 데이터 수집을 "쿼리"할 수 있는 기능을 제공합니다.컬렉션(여기서는 문자열 컬렉션)에 대해 데이터베이스 쿼리(선택, 위치 등)와 같은 구문을 사용할 수 있습니다.

"목록에서 아이템을 가져오세요"와 같은 작업을 합니다.

"lambda expression"을 사용하는 위치

람다 식을 간단히 말하면 다음과 같습니다(입력 파라미터 => 반환값).

따라서 파라미터 "item"의 경우 "item"을 반환합니다.Contains("required string")". 따라서 항목에 문자열이 포함되어 있으면 true가 반환되고 조건을 충족했기 때문에 목록에서 선택됩니다.

심플하게 하기 위해서, 이것을 사용합니다.

foreach(string item in myList)//Iterate through each item.
{
 if(item.Contains("Search Term")//True if the item contains search pattern.
 {
   return item;//Return the matched item.
 }
}

또는 for loop으로 이 작업을 수행하려면 이 작업을 사용합니다.

    for (int iterator = 0; iterator < myList.Count; iterator++)
    {
        if (myList[iterator].Contains("String Pattern"))
        {
            return myList[iterator];
        }
    }

필요에 따라 Any, Where, First 및 FirstOrDefault를 조합할 수도 있고 이러한 메서드에 술어를 배치할 수도 있습니다.

일치하는 항목을 찾을 수 없을 때 예외를 발생시키는 경우를 제외하고는 First를 사용하지 않는 것이 좋습니다.First Or Default는 일반적으로 일치하는 항목이 없는 경우(문자열의 기본값은 null, int는 0, bool은 false 등) 기본 유형을 반환합니다.

using System.Collections.Generic;
using System.Linq;


bool exists;
string firstMatch;
IEnumerable<string> matchingList;

var myList = new List<string>() { "foo", "bar", "foobar" };

exists = myList.Any(x => x.Contains("o"));
// exists => true

firstMatch = myList.FirstOrDefault(x => x.Contains("o"));
firstMatch = myList.First(x => x.Contains("o"));
// firstMatch => "foo"

firstMatch = myList.First(x => x.Contains("dark side"));
// throws exception because no element contains "dark side"

firstMatch = myList.FirstOrDefault(x => x.Contains("dark side"));
// firstMatch => null

matchingList = myList.Where(x => x.Contains("o")); 
// matchingList => { "foo", "foobar" }

https://rextester.com/TXDL57489에서 이 코드를 테스트합니다.

다른 답변에서는 Bool 옵션을 보지 못했기 때문에 아래 코드가 도움이 되었으면 합니다.

그냥 사용하다Any()

string myString = "test";
bool exists = myList
             .Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();

목록이 비어 있는지 여부를 여러 가지 방법으로 확인할 수 있습니다.

1) 체크리스트가 null인 경우 체크카운트는 다음과 같이0보다 커집니다.-

if(myList!=null && myList.Count>0)
{
    //List has more than one record.
}

2) 다음과 같은 linq 쿼리를 사용하여 목록의 null과 카운트를 0보다 크게 확인합니다.-

if(myList!=null && myList.Count>0)
{
    //List has more than one record.
}

언급URL : https://stackoverflow.com/questions/18767302/check-if-list-contains-element-that-contains-a-string-and-get-that-element

반응형