ProgramingTip

조건에 따라 목록에서 항목 제거

bestdevel 2020. 11. 9. 20:28
반응형

조건에 따라 목록에서 항목 제거


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를 쿼리 할 수 ​​있습니다.stuffSingleOrDefault()

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

반응형