[.NET]IEnumerable的Sort, Distinct, Where的操作方式

[.NET]IEnumerable的Sort, Distinct, Where的操作方式

如果您有一個Array,需要Sort, Distinct, Where要如何做呢?

以下將介紹使用int陣列及物件陣列針對Sort, Distinct, Where的操作方式


//定義一個員編代號 int陣列
int[] employeeIds = new int[] { 1, 2, 3, 1 };

//依員編從高到底排序
var desSortEmps = employeeIds.OrderByDescending(id => id);
// return 3, 2, 1, 1

//取得不重覆的員工資料
var distinctEmps = employeeIds.Distinct();
// return 1, 2, 3


//移除不要的Employee
int[] removeIds = new int[] { 1, 2 };
var filteredEmps = employeeIds.Where(id => !removeIds.Contains(id));
// return 3

 

那如果物件陣列是否也相同呢?

其實方法都是相同的,但是要如何知道自定物件那個才是相同的,只有我們自己知道,所以需要實作IEquatable,這樣使用Distinct時,才能依某個值來比較是否相同,如下,


//因為要使用Distinct,所以要實作IEquatable
public class Employee : IEquatable<Employee>
{
	public int Id { get; set; }
	public string Name { get; set; }


	public bool Equals(Employee other)
	{
		if (Name == other.Name)
			return true;
		return false;
	}
	public override int GetHashCode()
	{
		int hashName = Name == null ? 0 : Name.GetHashCode();
		return hashName;
	}
}

 

以上Employee我是判斷只要是Name相同就算是相同的物件,您也可判斷是Id + Name相同才算是相同,就可改成以下的方式,


public override int GetHashCode()
{
	int hashName = Name == null ? 0 : Name.GetHashCode();
	int hashId = Id.GetHashCode();
	return hashName ^ Id;
}

 

物件定義好後,就可開始Employee物件陣列針對Sort, Distinct, Where的操作,如下,


Employee[] employees = new Employee[] { new Employee() { Id = 1, Name = @"亂馬客" }
	, new Employee() { Id = 2, Name = @"達斯汀" }, new Employee() { Id = 3, Name = @"郭小玉" }
	, new Employee() { Id = 1, Name = @"亂馬客" } };
//依員編從高到底排序
var desSortEmps = employees.OrderByDescending(emp => emp.Id);
//取得不重覆的員工資料
var distinctEmps = employees.Distinct();

//移除不要的Employee
string[] removeEmpNames = new string[] { @"亂馬客", @"達斯汀" };
var filteredEmps = employees.Where(emp => removeEmpNames.Contains(emp.Name) == false);

 

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^