[.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:從零開始的軟體開發生活」
請大家繼續支持 ^_^