대소문자를 구분하지 않는 목록 검색
.testList
현이 많이 들어있어요. 싶어요.testList
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★따라서 대소문자를 구분하지 않고 목록을 검색하여 효율적으로 만들어야 합니다. 수 없다Contains
나도 사용하고 않아.ToUpper/ToLower
퍼먼퍼가 있어요이 방법은 효과가 있습니다.
if(testList.FindAll(x => x.IndexOf(keyword,
StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
Console.WriteLine("Found in list");
이것은 효과가 있지만, 부분적인 단어와 일치하기도 합니다.목록에 "got"이 포함된 경우 "ot"이 목록에 이미 있다고 주장하므로 "ot"을 추가할 수 없습니다.대소문자를 구분하지 않고 단어를 정확하게 일치시킬 수 있는 목록을 효율적으로 검색할 수 있는 방법이 있습니까?감사해요.
오래된 게시물인 건 알지만 혹시 다른 사람이 볼지도 모르니까Contains
다음과 같이 대소문자를 구분하지 않는 문자열 균등 비교자를 제공합니다.
using System.Linq;
// ...
if (testList.Contains(keyword, StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine("Keyword Exists");
}
이는 msdn에 따르면 .net 2.0부터 사용 가능했습니다.
String 대신.IndexOf, String을 사용합니다.부분적인 일치가 없음을 확인하는 데 사용됩니다.또한 모든 요소를 통과할 때 FindAll을 사용하지 말고 FindIndex를 사용하십시오(처음 누르면 중지됩니다).
if(testList.FindIndex(x => x.Equals(keyword,
StringComparison.OrdinalIgnoreCase) ) != -1)
Console.WriteLine("Found in list");
또는 몇 가지 LINQ 메서드를 사용합니다(처음 히트한 메서드에서도 정지합니다).
if( testList.Any( s => s.Equals(keyword, StringComparison.OrdinalIgnoreCase) ) )
Console.WriteLine("found in list");
위의 Adam Sills의 답변을 바탕으로 Contains의 깔끔한 확장 방법을 소개합니다.:)
///----------------------------------------------------------------------
/// <summary>
/// Determines whether the specified list contains the matching string value
/// </summary>
/// <param name="list">The list.</param>
/// <param name="value">The value to match.</param>
/// <param name="ignoreCase">if set to <c>true</c> the case is ignored.</param>
/// <returns>
/// <c>true</c> if the specified list contais the matching string; otherwise, <c>false</c>.
/// </returns>
///----------------------------------------------------------------------
public static bool Contains(this List<string> list, string value, bool ignoreCase = false)
{
return ignoreCase ?
list.Any(s => s.Equals(value, StringComparison.OrdinalIgnoreCase)) :
list.Contains(value);
}
하시면 됩니다.StringComparer
('')를 )Contains
예를 들어 다음과 같이 LINQ로부터의 오버로드가 발생합니다.
using System.Linq;
var list = new List<string>();
list.Add("cat");
list.Add("dog");
list.Add("moth");
if (list.Contains("MOTH", StringComparer.OrdinalIgnoreCase))
{
Console.WriteLine("found");
}
Lance Larsen의 답변에 따라 권장 문자열을 사용한 확장 메서드를 소개합니다.문자열 대신 비교합니다.동등.
String 오버로드 사용을 강력히 권장합니다.는 StringComparison 파라미터를 사용합니다.이러한 과부하로 인해 의도한 정확한 비교 동작을 정의할 수 있을 뿐만 아니라 이를 사용하면 다른 개발자가 코드를 더 잘 읽을 수 있게 됩니다.[Josh Free @ BCL 팀 블로그]
public static bool Contains(this List<string> source, string toCheck, StringComparison comp)
{
return
source != null &&
!string.IsNullOrEmpty(toCheck) &&
source.Any(x => string.Compare(x, toCheck, comp) == 0);
}
IndexOf의 결과가 0보다 크거나 같은지 확인하고 있습니다.즉, 문자열의 어느 부분에서 일치가 시작되는지 여부를 의미합니다.0과 동일한지 확인해 보십시오.
if (testList.FindAll(x => x.IndexOf(keyword,
StringComparison.OrdinalIgnoreCase) >= 0).Count > 0)
Console.WriteLine("Found in list");
이제 "got"과 "ot"은 일치하지 않지만 "got"과 "goa"는 일치하지 않을 것입니다.이를 피하기 위해 두 문자열의 길이를 비교할 수 있습니다.
이 모든 복잡성을 피하기 위해 목록 대신 사전을 사용할 수 있습니다.키는 소문자 문자열이 되고 값은 실제 문자열이 됩니다.이렇게 하면 퍼포먼스가 저하되지 않습니다.ToLower
각 비교에 대해 설명하지만Contains
.
다음으로 전체 목록에서 키워드를 검색하여 해당 항목을 삭제하는 예를 나타냅니다.
public class Book
{
public int BookId { get; set; }
public DateTime CreatedDate { get; set; }
public string Text { get; set; }
public string Autor { get; set; }
public string Source { get; set; }
}
[텍스트] 속성의 키워드가 포함된 책을 제거하려면 키워드 목록을 작성하여 책 목록에서 제거할 수 있습니다.
List<Book> listToSearch = new List<Book>()
{
new Book(){
BookId = 1,
CreatedDate = new DateTime(2014, 5, 27),
Text = " test voprivreda...",
Autor = "abc",
Source = "SSSS"
},
new Book(){
BookId = 2,
CreatedDate = new DateTime(2014, 5, 27),
Text = "here you go...",
Autor = "bcd",
Source = "SSSS"
}
};
var blackList = new List<string>()
{
"test", "b"
};
foreach (var itemtoremove in blackList)
{
listToSearch.RemoveAll(p => p.Source.ToLower().Contains(itemtoremove.ToLower()) || p.Source.ToLower().Contains(itemtoremove.ToLower()));
}
return listToSearch.ToList();
비슷한 문제가 있었습니다. 아이템의 인덱스가 필요했지만 대소문자를 구분하지 않고 웹을 몇 분간 둘러봤지만 아무것도 찾을 수 없었습니다.그래서 이 작업을 완료하기 위한 간단한 방법을 작성했습니다.다음은 예를 제시하겠습니다.
private static int getCaseInvariantIndex(List<string> ItemsList, string searchItem)
{
List<string> lowercaselist = new List<string>();
foreach (string item in ItemsList)
{
lowercaselist.Add(item.ToLower());
}
return lowercaselist.IndexOf(searchItem.ToLower());
}
이 코드를 같은 파일에 추가하고 다음과 같이 호출합니다.
int index = getCaseInvariantIndexFromList(ListOfItems, itemToFind);
이게 도움이 됐으면 좋겠네요, 행운을 빌어요!
언급URL : https://stackoverflow.com/questions/3947126/case-insensitive-list-search
'programing' 카테고리의 다른 글
ContentControl과 ContentPresenter의 차이점은 무엇입니까? (0) | 2023.04.11 |
---|---|
큰 테이블의 VARCHAR 컬럼 크기를 늘릴 때 문제가 발생합니까? (0) | 2023.04.11 |
Bash에서 어레이를 슬라이스하는 방법 (0) | 2023.04.11 |
# 꺽쇠 괄호 < >와 따옴표 "를 사용하여 Import합니다. (0) | 2023.04.11 |
지정된 상대 경로 절대 경로 검색 방법 (0) | 2023.04.11 |