2014年2月18日 星期二

[ASP.NET]如何刪除重複的值(物件)

昨天遇到一個問題

就是下拉選單的資料是從現有的方法來的

下拉選單的資料不應該有重複

但問題現有的方法沒辦法做distinct過濾重複的資料

又不能自己寫ADO.NET連資料庫

所以你還是只能用他給你的資料做處理

比較土法煉鋼的方式就是寫一個陣列判斷陣列中有無該值

有就繼續下一個沒有就存進陣列

但這種方式的時間複雜度應該也是最差的

其實類似的問題之前在Java已經有解過-大樂透程式

在C#上我找到的方法是使用Enumerable的Distinct方法

最後解法如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class distinct : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        List<distinctexample> list = new List<distinctexample>();
        list.Add(new distinctExample(45));
        list.Add(new distinctExample(32));
        list.Add(new distinctExample(9));
        list.Add(new distinctExample(32));
        list.Add(new distinctExample(66));

        foreach (distinctExample x in list)
        {
            Response.Write(x.number+" ");
        }
        Response.Write("
");
        IEnumerable<distinctexample> distinctList = list.Distinct();
        foreach (distinctExample distinctResult in distinctList)
        {
            Response.Write(distinctResult.number+" ");
        }
    }
}
public class distinctExample : IEquatable<distinctexample>
{
    public bool Equals(distinctExample anyNumber)
    {
        if(Object.ReferenceEquals(anyNumber,null))
            return false;
        if (Object.ReferenceEquals(this, anyNumber))
            return true;
        return number.Equals(anyNumber.number);
    }

    public override int GetHashCode()
    {
        int hashdistinctExample = number == null ? 0 : number.GetHashCode();
        return hashdistinctExample;
    }

    public distinctExample(int number)
    {
        this.number = number;
    }
    public int number
    {
        get;
        set;
    }
}

記得實作Equals跟GetHashCode這兩個方法才能進行distinct

Enumerable也有提供不少常用的方法像是OrderBy、Max、Min、Reverse...

參考資料:Enumerable.Distinct 方法
Enumerable 方法
C# 3.0 泛型集合 Generic Collection 中的 List

沒有留言:

張貼留言