C#의 목록에서 항목을 제거하는 방법은 무엇입니까?
결과 목록에 다음과 같이 저장된 목록이 있습니다.
var resultlist = results.ToList();
다음과 같습니다.
ID FirstName LastName
-- --------- --------
1 Bill Smith
2 John Wilson
3 Doug Berg
ID 2를 목록에서 제거하려면 어떻게 해야 합니까?
List<T>
에는 두 가지 방법이 있습니다.
항목의 인덱스를 알고 있는 경우 RemoveAt(int 인덱스)를 사용할 수 있습니다.예:
resultlist.RemoveAt(1);
var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);
항목이 실제로 존재하는지 확신할 수 없는 경우 SingleOrDefault를 사용할 수 있습니다. SingleOrDefault
돌아올 것입니다null
항이없경우는목경(우)이 없는 Single
항목을 찾을 수 없는 경우 예외를 던집니다).될 때 둘 다 id
).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
resultList.Remove(itemToRemove);
단답:
에서 제거)results
)
results.RemoveAll(r => r.ID == 2);
ID가 2인 항목을 제거합니다.results
(제자리에)
)results
):
var filtered = result.Where(f => f.ID != 2);
ID가 2인 항목을 제외한 모든 항목을 반환합니다.
상세 답변:
제거하고자 하는 항목 ID 목록을 가질 수 있기 때문에 매우 유연하다고 생각합니다. 다음 예를 참조하십시오.
다음이 있는 경우:
class myClass {
public int ID; public string FirstName; public string LastName;
}
몇 을 고몇가값할습다니당했을지에 할당했습니다.results
다음과 같습니다(아래의 모든 예에 사용).
var results = new List<myClass> {
new myClass { ID=1, FirstName="Bill", LastName="Smith" }, // results[0]
new myClass { ID=2, FirstName="John", LastName="Wilson" }, // results[1]
new myClass { ID=3, FirstName="Doug", LastName="Berg" }, // results[2]
new myClass { ID=4, FirstName="Bill", LastName="Wilson" } // results[3]
};
그런 다음 제거할 ID 목록을 정의할 수 있습니다.
var removeList = new List<int>() { 2, 3 };
이를 사용하여 제거합니다.
results.RemoveAll(r => removeList.Any(a => a==r.ID));
2번과 3번 항목을 제거하고 1번과 4번 항목을 유지합니다.removeList
이 작업은 제자리에서 수행되므로 추가 할당이 필요하지 않습니다.
물론 다음과 같은 단일 항목에도 사용할 수 있습니다.
results.RemoveAll(r => r.ID==4);
여기서 ID가 4인 빌을 제거합니다.
해야 할 입니다. 즉, 즉, 마으로언할인있것다니즉입다는덱다가있서니수액습도, 동배럼할세스처열적급막지야해목것록에은▁a▁have,,.results[3]
결과 목록의 네 번째 요소가 표시됩니다(첫 번째 요소는 인덱스 0, 두 번째 요소는 인덱스 1 등).
따라서 이름이 결과 목록의 4번째 요소와 동일한 모든 항목을 제거하려면 다음과 같이 하면 됩니다.
results.RemoveAll(r => results[3].FirstName == r.FirstName);
이후에는 John과 Doug만 목록에 남아 있고 Bill은 제거됩니다(예의 첫 번째와 마지막 요소).에 두 이 한 후 큰는 1 "RemoveAll"입니다.
, (계속),results.Count() - 1
).
일부 트리비아:
은 이 지식을 수 .
void myRemove() { var last = results.Count() - 1;
results.RemoveAll(r => results[last].FirstName == r.FirstName); }
이 기능을 두 번 호출하면 어떻게 될 것 같습니까?
맘에 들다
myRemove(); myRemove();
답변(표시하려면 클릭):
첫 번째 호출은 첫 번째와 마지막 위치에서 Bill을 제거하고, 두 번째 호출은 Doug를 제거하며 John Wilson만 목록에 남아 있습니다.
참고: C# Version 8 이후, 당신은 또한 쓸 수 있습니다.results[^1]
대신에var last = results.Count() - 1;
그리고.results[last]
:
void myRemove() => results.RemoveAll(r => results[^1].FirstName == r.FirstName);
따라서 로컬 변수가 필요하지 않습니다.last
더 이상(인덱스 및 범위 참조).또한 원라이너이기 때문에 곱슬머리가 필요하지 않고 사용할 수 있습니다.=>
대신.C#의 모든 새 기능 목록을 보려면 여기를 참조하십시오.
DotNetFiddle:데모 실행
resultList = results.Where(x=>x.Id != 2).ToList();
내가 좋아하는 작은 Linq 도우미가 있는데, 구현하기 쉽고 "where not" 조건으로 쿼리를 조금 더 쉽게 읽을 수 있습니다.
public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
return source.Where(x=>!predicate(x));
}
//usage in above situation
resultList = results.ExceptWhere(x=>x.Id == 2).ToList();
목록의 종류를 지정하지 않지만 일반 목록은 다음 중 하나를 사용할 수 있습니다.RemoveAt(index)
방법, 또는Remove(obj)
방법:
// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);
// RemoveAt(index)
resultList.RemoveAt(1);
더욱 단순화된 기능:
resultList.Remove(resultList.Single(x => x.Id == 2));
새 var 개체를 만들 필요가 없습니다.
다른 접근법이 있습니다.를 사용합니다.List.RemoveAt
.
KeithS가 제시한 솔루션(단순한 솔루션)을 사용할 수도 있습니다.Where
/ToList
이 접근 방식은 원래 목록 개체를 변형한다는 점에서 다릅니다.이것은 기대에 따라 좋은(또는 나쁜) "기능"이 될 수 있습니다.
어쨌든, 그.FindIndex
는 (보호자와 함께 이동)을 합니다.RemoveAt
, ID를 사용하면 .RemoveAt
(vs)Remove
목록을 통한 두 번째 O(n) 검색을 방지합니다.
다음은 LINQPad 스니펫입니다.
var list = new List<int> { 1, 3, 2 };
var index = list.FindIndex(i => i == 2); // like Where/Single
if (index >= 0) { // ensure item found
list.RemoveAt(index);
}
list.Dump(); // results -> 1, 3
해피 코딩.
이 코드를 사용해 보십시오.
resultlist.Remove(resultlist.Find(x => x.ID == 2));
아니면 그냥resultlist.RemoveAt(1)
정확하게 색인을 알고 있다면요.
{
class Program
{
public static List<Product> list;
static void Main(string[] args)
{
list = new List<Product>() { new Product() { ProductId=1, Name="Nike 12N0",Brand="Nike",Price=12000,Quantity=50},
new Product() { ProductId =2, Name = "Puma 560K", Brand = "Puma", Price = 120000, Quantity = 55 },
new Product() { ProductId=3, Name="WoodLand V2",Brand="WoodLand",Price=21020,Quantity=25},
new Product() { ProductId=4, Name="Adidas S52",Brand="Adidas",Price=20000,Quantity=35},
new Product() { ProductId=5, Name="Rebook SPEED2O",Brand="Rebook",Price=1200,Quantity=15}};
Console.WriteLine("Enter ProductID to remove");
int uno = Convert.ToInt32(Console.ReadLine());
var itemToRemove = list.Find(r => r.ProductId == uno);
if (itemToRemove != null)
list.Remove(itemToRemove);
Console.WriteLine($"{itemToRemove.ProductId}{itemToRemove.Name}{itemToRemove.Brand}{itemToRemove.Price}{ itemToRemove.Quantity}");
Console.WriteLine("------------sucessfully Removed---------------");
var query2 = from x in list select x;
foreach (var item in query2)
{
/*Console.WriteLine(item.ProductId+" "+item.Name+" "+item.Brand+" "+item.Price+" "+item.Quantity );*/
Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
}
}
}
}
언급URL : https://stackoverflow.com/questions/10018957/how-to-remove-item-from-list-in-c
'IT' 카테고리의 다른 글
"테이블을 다시 만들어야 하는 변경 내용 저장 방지" 부정적 영향 (0) | 2023.04.28 |
---|---|
AND 및 OR을 모두 사용하는 mongodb 쿼리 (0) | 2023.04.28 |
"COM 클래스 공장에서 구성 요소를 검색하는 중...오류: 80070005 액세스가 거부되었습니다." (HRESULT: 0x80070005(E_ACCESSDENIED)) (0) | 2023.04.28 |
(NOLOCK)와 트랜잭션 격리 수준 설정 읽기가 커밋되지 않은 상태 (0) | 2023.04.28 |
"0"과 "1"을 거짓과 참으로 변환하는 방법 (0) | 2023.04.28 |