2015-09-30 44 views
0

我有下面的代碼可以工作,但想要一個更可重用的或獲得相同的結果。而不是Remove_At_WeightRemove_At_Code函數我想要一個通用的Remove函數,您可以選擇要比較的字段和要比較的字段。動態刪除功能

因此,例如,我可能會叫另一個對象說Recordo_3具有第三場 「字符串描述」 ,我要檢查該字段具有寫入新的「Remove_At_Description」功能了。

我可能從錯誤的角度來解決這個問題,並且有更好的方法來使用設計模式等等,如果有的話請告知。希望這是有道理的。

class Recordo 
{ 
    private string _code; 

    public string Code 
    { 
     get { return _code; } 
     set { _code = value; } 
    } 
    private int _weight; 

    public int Weight 
    { 
     get { return _weight; } 
     set { _weight = value; } 
    } 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    List<Recordo> lr = new List<Recordo>(); 

    lr.Add(new Recordo() {Code = "QQQ", Weight = 10}); 
    lr.Add(new Recordo() { Code = "AAA", Weight = 20 }); 
    lr.Add(new Recordo() { Code = "AAA", Weight = 10 }); 
    lr.Add(new Recordo() { Code = "QQQ", Weight = 10 });    

    lr = Remove_At_Code(lr,"QQQ"); 
    lr = Remove_At_Weight(r, "20"); 
    MessageBox.Show("Done!"); 
} 

private static List<Recordo> Remove_At_Weight(List<Recordo> lr, int weight) 
{ 
    for (int i = lr.Count-1; i > -1; i--) 
    { 
     if (lr[i].Weight == weight) 
     { 
      lr.RemoveAt(i); 
     } 
    } 
    return lr; 
} 

private static List<Recordo> Remove_At_Code(List<Recordo> lr, string code) 
{ 
    for (int i = lr.Count-1; i > -1; i--) 
    { 
     if (lr[i].Code == code) 
     { 
      lr.RemoveAt(i); 
     } 
    } 
    return lr; 
} 
+0

使用IComperable接口怎麼樣? - 谷歌它 –

+1

@MatthiasHerrmann IComparable不是必需的。我猜你的意思IEquatable –

+0

@Sriram既會工作 –

回答

1

首先讓我們做吧,沒有這些你都問了一個通用的方法(即你可以考慮用屬性名反射 - 見下文)。您的作品可使用Linq這樣

lr.RemoveAll(r => r.Code.Equals("QQQ")); 
lr.RemoveAll(r => r.Weight == 20); 

現在一個非常簡單的方式做,如果你真的想要的是通用的方法,你可以試試這個

public static class MyExtension 
{ 
    public static void RemoveAllWithPropertyValue<T>(this List<T> list, string propertyName, object value) 
    { 
     var property = typeof(T).GetProperty(propertyName); 
     list.RemoveAll(item => property.GetValue(item, null).Equals(value)); 
    } 
} 

,並使用該自定義擴展爲

lr.RemoveAllWithPropertyValue("Code", "QQQ"); 
lr.RemoveAllWithPropertyValue("Weight", 20); 

注意:這不是類型安全的,我們沒有做任何驗證!

+0

我知道我會過於複雜化,非常感謝你的工作。 – user3755946

+0

@ user3755946是的,這真的很簡單!爲了您的好奇心,請查看通用方法。不是'完美',但會爲你工作:) –

+0

會做,乾杯 – user3755946

0

這將是更簡單,只需使用LINQ:

這將讓所有的物品,其中重量不7.

lr = lr.Where(item => item.Weight != 7).ToList(); 

或者,如果你想繼續保持更喜歡你原來的代碼:

你可以通過一個函數

,並調用它是這樣的:

lr = GenericRemove(lr, item => item.Weight == 7 ); 


private static List<Recordo> GenericRemove(List<Recordo> lr, Func<Recordo, bool> filter) 
{ 
     for (int i = lr.Count-1; i > -1; i--) 
     { 

      if (filter(lr[i])) 
      { 
       lr.RemoveAt(i); 
      } 
     } 
     return lr; 
} 
+0

感謝響應 – user3755946

1

像@Matthias赫爾曼說,你可以使用ICompareable接口,但說實話,這個任務是很容易,你可以用一個簡單的LINQ查詢實現它。例如:

var theList = new List<Recordo>(); // lets assume it already have some records 
var someCode = "QQQ"; 
var someWeight = 15; 

theList.RemoveRange(theList.Where(x => x.Code == someCode)); 
//OR the following for weight 
theList.RemoveRange(theList.Where(x => x.Weight == someWeight)); 
+0

感謝您的回覆 – user3755946

+0

@MajkeloDev我認爲你的解決方案是最適合這種情況的解決方案。如果有一個數據綁定到這個列表中,我想最好的辦法是使用ObservableCollection(T) –

1

您可以使用List.RemoveAll Method

lr.RemoveAll(item => item.Code == "QQQ"); 
lr.RemoveAll(item => item.Weight == 20); 

你不需要自己的通用功能,因爲上述的方法做到了這一點你。

+0

感謝您的回覆 – user3755946