IT

C#의 목록에서 항목을 제거하는 방법은 무엇입니까?

itgroup 2023. 4. 28. 20:29
반응형

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);

또는 제거(T 항목)사용할 수 있습니다.

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

반응형