다음은 문자열 목록에서 항목을 찾는 간단한 예입니다. 일반적으로 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"];
따라서 수행중인 작업에 따라 사전이 유용 할 수 있습니다.