2017-07-13 48 views
-2

我有一個類對象的類的數組中刪除的項目:如何從使用C#中的removeAll(),並且其中()

Student student = new Student("Ram",20, new Address(hNo: 10, sNo: "10"), new Marks[] { new Marks("Maths", 90), new Marks("Science", 80), new Marks("Physics", 95) }); 

在我使用的removeAll()方法去除類物品,我得到如下錯誤:

cannot convert from 'System.Collections.Generic.IEnumerable' to 'System.Predicate'

這是我使用的代碼:我想從學生CL刪除引號( 「數學」,90)

string subject="Maths"; 
student.marks.ToList().RemoveAll(student.marks.Where(x => x.subject != marks)); 

屁股對象,但失敗。

+2

你讀過的removeall過的文檔? https://msdn.microsoft.com/en-us/library/wdka673a(v=vs.110).aspx。由於錯誤消息表明它期望預測,而不是要刪除的項目列表(儘管我注意到這不是你要的)。 – Chris

+0

@Chris你可以通過答案面板給出答案。這將有助於感謝你。 – yogihosting

+0

我不太清楚你實際上想要移除的內容,以及哪些是我沒有給出答案的原因。即,雖然我認爲我可以幫助解釋錯誤,但我不確定我是否能夠就如何實現您想要實現的目標給出一個很好的答案。 – Chris

回答

3

RemoveAll方法期望您給它一個lambda表達式,它將使用它來過濾要刪除的項目,並且您將爲它提供一組符合條件的項目集合。

只要改變調用只有表達,就大功告成了:

string subject="Maths"; 
student.marks = student.marks.Where(x => x.subject == subject).ToArray(); 
+0

pfff .....足夠公平的,如果它已經是一個列表,這不會是一個問題....讓我解決:) – dutzu

+0

@dutzu它不會刪除任何東西? – yogihosting

+0

@yogihosting是的,因爲標記是一個數組,你已經將它投到列表中,因此刪除從源代碼中解耦。試試我發佈的新版本 – dutzu

5

讓我們打破這種下降到簡單的東西:

Marks[] marks = new Marks[] 
{ 
    new Marks("Maths", 90), 
    new Marks("Science", 80), 
    new Marks("Physics", 95) 
}; 

這給了我:

marks如果我這樣做:

List<Marks> list = marks.ToList(); 

我結束了一個副本marks。我有這樣的:

list

現在,如果我叫list.RemoveAll(x => x.Subject != "Maths");我刪除所有,但由list"Maths"主題。現在看起來是這樣的:

list (2)

但因爲這是的marks一個副本然後marks仍然是相同的:

marks (2)

由於marks是一個數組,你不能刪除任何除非您重新創建陣列。 LINQ提供了一個簡單的方法來做到這一點:

marks = marks.Where(x => x.Subject != "Maths").ToArray(); 

這就是你應該做的。

或者使Student類別的Marks屬性爲List<Marks>而不是Marks[]

public class Student 
{ 
    public Student(List<Marks> marks) 
    { 
     this.Marks = marks; 
    } 
    public List<Marks> Marks; 
} 

然後就可以調用RemovalAll直接就可以了,就像這樣:

List<Marks> marks = new List<Marks>() 
{ 
     new Marks("Maths", 90), 
     new Marks("Science", 80), 
     new Marks("Physics", 95) 
}; 

var students = new Student(marks); 

students.Marks.RemoveAll(x => x.Subject != "Maths"); 
+0

謝謝,很好的解釋。 – yogihosting

+0

如果我想從.RemoveAll()方法做到這一點,那麼它是如何實現的? – yogihosting

+0

@yogihosting - 我已經添加了如何使用'.RemoveAll()'到我的答案的底部。 – Enigmativity

相關問題