在寫程序的時候會遇見這樣的問題,那就是去重,有什么方法更快呢。
當去重時,首先想到的是自己寫代碼,代碼大概如下:
private static void distinctListIntTest()
{
Console.WriteLine("未去重");
List<int> list = new List<int>() { 1, 2, 3, 4, 1, 2, 3, 4 };
foreach (int inst in list)
{
Console.WriteLine(inst);
}
Console.WriteLine("=======================");
Console.WriteLine("去重后");
List<int> list1 = new List<int>();
foreach (int inst in list)
{
if (!list1.Contains(inst))
{
list1.Add(inst);
}
}
foreach (int inst in list1)
{
Console.WriteLine(inst);
}
}
這段代碼確實能實現我們想要的效果,結果如下:
這段代碼雖然能實現,但是要寫很多代碼,用起來不方便。有沒有更好的辦法呢,辦法是有的,那就是lambda表達式的distinct方法,代碼如下:
private static void distinctListInt()
{
Console.WriteLine("未去重");
List<int> list = new List<int>() { 1, 2, 3, 5, 1, 2, 3, 5 };
foreach (int inst in list)
{
Console.WriteLine(inst);
}
Console.WriteLine("=======================");
Console.WriteLine("去重后");
list = list.Distinct().ToList();
foreach (int inst in list)
{
Console.WriteLine(inst);
}
}
執行結果如下:
當簡單的類型可以了,那如果是一個對象怎么辦,用自己寫的方法代碼如下:
首先聲明一個對象
public class user
{
public string Name { get; set; }
public int Age { get; set; }
}
去重的方法
private static void distinctListEntityTest()
{
Console.WriteLine("未去重");
List<user> list = new List<user>();
user user = new user() { Name = "張三", Age = 13 };
list.Add(user);
user = new user() { Name = "張三", Age = 13 };
list.Add(user);
user = new user() { Name = "李四", Age = 14 };
list.Add(user);
user = new user() { Name = "李四", Age = 14 };
list.Add(user);
user = new user() { Name = "王五", Age = 15 };
list.Add(user);
user = new user() { Name = "王五", Age = 15 };
list.Add(user);
foreach (user inst in list)
{
Console.WriteLine(inst.Name);
}
Console.WriteLine("=======================");
Console.WriteLine("去重后");
List<user> list1 = new List<user>();
foreach (user inst in list)
{
bool isbool = true;
foreach (user inst1 in list1)
{
if (inst1.Name.Equals(inst.Name))
{
isbool = false;
break;
}
}
if (isbool)
{
list1.Add(inst);
}
}
foreach (user inst in list1)
{
Console.WriteLine(inst.Name);
}
}
去重的方法【lambda表達式】
private static void distinctListEntityTest()
{
Console.WriteLine("未去重");
List<user> list = new List<user>();
user user = new user() { Name = "張三", Age = 13 };
list.Add(user);
user = new user() { Name = "張三", Age = 13 };
list.Add(user);
user = new user() { Name = "李四", Age = 14 };
list.Add(user);
user = new user() { Name = "李四", Age = 14 };
list.Add(user);
user = new user() { Name = "王五", Age = 15 };
list.Add(user);
user = new user() { Name = "王五", Age = 15 };
list.Add(user);
foreach (user inst in list)
{
Console.WriteLine(inst.Name);
}
Console.WriteLine("=======================");
Console.WriteLine("去重后");
List<user> list1=new List<user>();
foreach (user inst in list)
{
if (list1.Count(u => u.Name.Equals(inst.Name))>0)//這句用了lambda表達式
{
continue;
}
list1.Add(inst);
}
foreach (user inst in list1)
{
Console.WriteLine(inst.Name);
}
}
這兩種方法執行結果如下:
下面就用lambda表達式的distinct()方法代碼如下
private static void distinctListEntity()
{
Console.WriteLine("未去重");
List<user> list = new List<user>();
user user = new user() { Name = "張三", Age = 13 };
list.Add(user);
user = new user() { Name = "張三", Age = 13 };
list.Add(user);
user = new user() { Name = "李四", Age = 14 };
list.Add(user);
user = new user() { Name = "李四", Age = 14 };
list.Add(user);
user = new user() { Name = "王五", Age = 15 };
list.Add(user);
user = new user() { Name = "王五", Age = 15 };
list.Add(user);
foreach (user inst in list)
{
Console.WriteLine(inst.Name);
}
Console.WriteLine("=======================");
Console.WriteLine("去重后");
list = list.Distinct(new userCompare()).ToList();
foreach (user inst in list)
{
Console.WriteLine(inst.Name);
}
}
}
class userCompare : IEqualityComparer<user>
{
#region IEqualityComparer<user> Members
public bool Equals(user x, user y)
{
return x.Name.Equals(y.Name);
}
public int GetHashCode(user obj)
{
return obj.Name.GetHashCode();
}
#endregion
}
運行結果如下:
最后的lambda表達式的distinct()方法只是拋磚引玉,distinct()方法好像有更簡單的實現方法,歡迎為我解惑。