반응형
조건에 따라 목록에서 항목 제거
public struct stuff
{
public int ID;
public int quan;
}
ID
= 1 인 제품을 제거하고 싶습니다 . 현재 이것을 시도하고 있습니다.
prods.Remove(new stuff{ prodID = 1});
작동하지 않습니다.
모두에게 감사합니다
linq 사용 :
prods.Remove( prods.Single( s => s.ID == 1 ) );
아마도 SingleOrDefault()
요소가 전혀 존재하는지 사용 하고 확인 하고 싶을 수도 있습니다 ...
편집 : 은 구조체
이므로 null을 반환하지 않습니다. 그러나 default (stuff)를 반환 하며 ID는 0입니다. 일반적인 물건 개체에 대한 ID가 0이 아닌 경우이 ID를 쿼리 할 수 있습니다.stuff
SingleOrDefault()
var stuffToRemove = prods.SingleOrDefault( s => s.ID == 1 )
if( stuffToRemove.ID != 0 )
{
prods.Remove( stuffToRemove );
}
컬렉션 유형이 List<stuff>
이면 가장 좋은 방법은 다음과 같습니다.
prods.RemoveAll(s => s.ID == 1)
이것은 목록을 한 번만 통과 (반복)하므로 다른 방법보다 더 효율적이어야합니다.
유형이 더 일반적으로 ICollection<T>
이면 성능에 관심이 있다면 짧은 확장 메서드를 작성하는 것이 도움이 될 수 있습니다. 그렇지 않은 경우 LINQ ( Where
또는 호출 Single
) 를 사용하지 않아도 됩니다.
LINQ가있는 경우 :
var itemtoremove = prods.Where(item => item.ID == 1).First();
prods.Remove(itemtoremove)
prods.Remove(prods.Find(x => x.ID == 1));
prods.Remove(prods.Single(p=>p.ID == 1));
Vincent가 제안한 것처럼 foreach에서 컬렉션을 수정할 수 없습니다.
참조가있는 항목 만 제거 할 수 있습니다. 따라서 전체 목록을 검색해야합니다.
stuff r;
foreach(stuff s in prods) {
if(s.ID == 1) {
r = s;
break;
}
}
prods.Remove(r);
또는
for(int i = 0; i < prods.Length; i++) {
if(prods[i].ID == 1) {
prods.RemoveAt(i);
break;
}
}
Linq를 사용할 수 있습니다.
var prod = from p in prods
where p.ID != 1
select p;
참고 URL : https://stackoverflow.com/questions/3279145/remove-item-from-list-based-on-condition
반응형
'ProgramingTip' 카테고리의 다른 글
RVM없이 Ubuntu에 Ruby 2를 설치하는 방법 (0) | 2020.11.09 |
---|---|
숫자 배열에서 누락 된 숫자를 찾는 가장 빠른 방법 (0) | 2020.11.09 |
Android FragmentTransaction 사용자 정의 애니메이션 (알 수없는 애니메이터 이름 : 번역) (0) | 2020.11.09 |
NSArray를 반복하는 쉬운 방법이 거꾸로? (0) | 2020.11.09 |
Rails + New Relic : RPM은 무엇을 의미합니까? (0) | 2020.11.09 |