목록에 문자열이 포함된 요소가 포함되어 있는지 확인하고 해당 요소를 가져옵니다.
이 질문에 대한 답을 찾던 중 LINQ를 사용하여 비슷한 질문을 발견했지만 익숙하지 않아서 완전히 이해하지 못했습니다(그리고 구현).기본적으로 제가 하고 싶은 것은 다음과 같습니다.
- 목록의 요소에 특정 문자열이 포함되어 있는지 확인합니다.
- 문제가 있는 경우 해당 요소를 가져옵니다.
저는 솔직히 어떻게 해야 할지 모르겠어요.생각해 낼 수 있는 것은, 다음과 같습니다(물론 동작하지 않습니다).
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
'programing' 카테고리의 다른 글
EPPlus의 컬럼 동결(Excel 분할 함수) (0) | 2023.04.21 |
---|---|
현재 분기의 끝부분이 원격 분기의 끝부분 뒤에 있기 때문에 업데이트가 거부되었습니다. (0) | 2023.04.21 |
UITable View - 맨 위로 스크롤 (0) | 2023.04.21 |
저장 프로시저에서 새 GUID를 생성하는 방법 (0) | 2023.04.21 |
몬테카를로 시뮬레이션에서는 Excel의 RAND() 함수가 얼마나 좋습니까? (0) | 2023.04.16 |