返回LINQ大全首页
Distinct()返回序列中的非重复元素。 MSDN
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public static class Program
{
static void Main( string[] args )
{
int[] dataA = new int[] { 0, 1, 3, 3, 2 };
List dataB = new List() { 1.5f, 1.5f, 1.5f, 1.5f };
string[] dataC = new string[] { "征史郎", "征四郎", "征史郎", "正史郎" };
IEnumerable dataA_D = dataA.Distinct();
IEnumerable dataB_D = dataB.Distinct();
IEnumerable dataC_D = dataC.Distinct();
System.Console.WriteLine( "dataA :{0}", dataA.Text() );
System.Console.WriteLine( "dataA Distinct:{0}", dataA_D.Text() );
System.Console.WriteLine( "dataB :{0}", dataB.Text() );
System.Console.WriteLine( "dataB Distinct:{0}", dataB_D.Text() );
System.Console.WriteLine( "dataC :{0}", dataC.Text() );
System.Console.WriteLine( "dataC Distinct:{0}", dataC_D.Text() );
System.Console.ReadKey();
}
public static string Text( this IEnumerable i_source )
{
string text = string.Empty;
foreach( var value in i_source )
{
text += string.Format( "[{0}], ", value );
}
return text;
}
}
dataA :[0], [1], [3], [3], [2],
dataA Distinct:[0], [1], [3], [2],
dataB :[1.5], [1.5], [1.5], [1.5],
dataB Distinct:[1.5],
dataC :[征史郎], [征四郎], [征史郎], [正史郎],
dataC Distinct:[征史郎], [征四郎], [正史郎],
上面的示例用的是值类型,那么引用类型呢?
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public static class Program
{
private class Parameter
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return string.Format( "Name:{0}, Age:{1}", Name, Age );
}
}
static void Main( string[] args )
{
Parameter[] parameters = new Parameter[]
{
new Parameter() { Name = "正一郎", Age = 52 },
new Parameter() { Name = "征史郎", Age = 18 },
new Parameter() { Name = "征史郎", Age = 18 },
};
IEnumerable parameters_D = parameters.Distinct();
System.Console.WriteLine( "parameters :{0}", parameters.Text() );
System.Console.WriteLine( "parameters Distinct:{0}", parameters_D.Text() );
System.Console.ReadKey();
}
public static string Text( this IEnumerable i_source )
{
string text = string.Empty;
foreach( var value in i_source )
{
text += string.Format( "[{0}], ", value );
}
return text;
}
}
parameters :[Name:正一郎, Age:52], [Name:征史郎, Age:18], [Name:征史郎,
Age:18],
parameters Distinct:[Name:正一郎, Age:52], [Name:征史郎, Age:18], [Name:征史郎,
Age:18],
我们会发现即使内容一样也没有去除,因为这里比较的是地址。
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public static class Program
{
private class Parameter
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return string.Format( "Name:{0}, Age:{1}", Name, Age );
}
}
static void Main( string[] args )
{
Parameter paramA = new Parameter() { Name = "正一郎", Age = 52 };
Parameter paramB = new Parameter() { Name = "征史郎", Age = 18 };
Parameter[] parameters = new Parameter[]
{
paramA,
paramB,
paramB,
};
IEnumerable parameters_D = parameters.Distinct();
System.Console.WriteLine( "parameters :{0}", parameters.Text() );
System.Console.WriteLine( "parameters Distinct:{0}", parameters_D.Text() );
System.Console.ReadKey();
}
public static string Text( this IEnumerable i_source )
{
string text = string.Empty;
foreach( var value in i_source )
{
text += string.Format( "[{0}], ", value );
}
return text;
}
}
parameters :[Name:正一郎, Age:52], [Name:征史郎, Age:18], [Name:征史郎,
Age:18],
parameters Distinct:[Name:正一郎, Age:52], [Name:征史郎, Age:18],
换成相同的元素则被成功剔除。那么我们有办法自定义比较规则吗? 答案是可以的,我们需要通过继承IEqualityComparer
实现比较类。
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public static class Program
{
private class Parameter
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return string.Format( "Name:{0}, Age:{1}", Name, Age );
}
}
private class ParameterComparer : IEqualityComparer
{
public bool Equals( Parameter i_lhs, Parameter i_rhs )
{
if( i_lhs.Name == i_rhs.Name &&
i_lhs.Age == i_rhs.Age )
{
return true;
}
return false;
}
public int GetHashCode( Parameter i_obj )
{
return i_obj.Age ^ i_obj.Name.GetHashCode();
}
}
static void Main( string[] args )
{
Parameter[] parameters = new Parameter[]
{
new Parameter() { Name = "正一郎", Age = 52 },
new Parameter() { Name = "征史郎", Age = 18 },
new Parameter() { Name = "征史郎", Age = 18 },
};
ParameterComparer Comparer = new ParameterComparer();
IEnumerable parameters_D = parameters.Distinct( Comparer );
System.Console.WriteLine( "parameters :{0}", parameters.Text() );
System.Console.WriteLine( "parameters Distinct:{0}", parameters_D.Text() );
System.Console.ReadKey();
}
public static string Text( this IEnumerable i_source )
{
string text = string.Empty;
foreach( var value in i_source )
{
text += string.Format( "[{0}], ", value );
}
return text;
}
}
parameters :[Name:正一郎, Age:52], [Name:征史郎, Age:18], [Name:征史郎,
Age:18],
parameters Distinct:[Name:正一郎, Age:52], [Name:征史郎, Age:18],