返回LINQ大全首页
SequenceEqual()SequenceEqual()
用于判断两个序列中的内容是否一致。
public static bool SequenceEqual( this IEnumerable first, IEnumerable second );
MSDN
下面示例用来比较数组和list中的内容是否一致。 要注意值类型和引用类型的使用区别。下面使用的是值类型。
代码示例:
public static class Program
{
static void Main( string[] args )
{
int[] dataA = new int[] { 0, 1, 2, 3, 4, 5 };
int[] dataB = new int[] { 0, 1, 2, 4, 3, 5 };
List dataC = new List { 0, 1, 2, 3, 4, 5 };
bool resultAB = dataA.SequenceEqual( dataB );
bool resultAC = dataA.SequenceEqual( dataC );
bool resultBC = dataB.SequenceEqual( dataC );
System.Console.WriteLine( "dataA:{0}", dataA.Text() );
System.Console.WriteLine( "dataB:{0}", dataB.Text() );
System.Console.WriteLine( "dataC:{0}", dataC.Text() );
System.Console.WriteLine( "AB内容是否相同:{0}", resultAB );
System.Console.WriteLine( "AC内容是否相同:{0}", resultAC );
System.Console.WriteLine( "BC内容是否相同:{0}", resultBC );
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], [2], [3], [4], [5],
dataB:[0], [1], [2], [4], [3], [5],
dataC:[0], [1], [2], [3], [4], [5],
AB内容是否相同:{0}:False
AC内容是否相同:{0}:True
BC内容是否相同:{0}:False
可以看出和我们预想中的效果一样,内容相同则返回true。 接下来尝试下引用类型。
代码示例:
public static class Program
{
private class Parameter
{
public int ID { get; set; }
public string Name { get; set; }
public override string ToString()
{
return string.Format( "ID:{0}, Name:{1}", ID, Name );
}
}
static void Main( string[] args )
{
Parameter[] dataA = new Parameter[]
{
new Parameter() { ID = 0, Name = "正一郎" },
new Parameter() { ID = 5, Name = "清次郎" },
};
Parameter[] dataB = new Parameter[]
{
new Parameter() { ID = 0, Name = "正一郎" },
new Parameter() { ID = 5, Name = "清次郎" },
};
Parameter[] dataC = new Parameter[]
{
new Parameter() { ID = 4, Name = "征史郎" },
};
bool resultAB = dataA.SequenceEqual( dataB );
bool resultAC = dataA.SequenceEqual( dataC );
bool resultBC = dataB.SequenceEqual( dataC );
System.Console.WriteLine( "dataA:{0}", dataA.Text() );
System.Console.WriteLine( "dataB:{0}", dataB.Text() );
System.Console.WriteLine( "dataC:{0}", dataC.Text() );
System.Console.WriteLine( "AB内容是否相同:{0}", resultAB );
System.Console.WriteLine( "AC内容是否相同:{0}", resultAC );
System.Console.WriteLine( "BC内容是否相同:{0}", resultBC );
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:[ID:0, Name:正一郎], [ID:5, Name:清次郎],
dataB:[ID:0, Name:正一郎], [ID:5, Name:清次郎],
dataC:[ID:4, Name:征史郎],
AB内容是否相同:{0}:False
AC内容是否相同:{0}:False
BC内容是否相同:{0}:False
可以发现内容一致但引用不同返回的是False。 那么在引用相同的情况呢?
代码示例:
public static class Program
{
private class Parameter
{
public int ID { get; set; }
public string Name { get; set; }
public override string ToString()
{
return string.Format( "ID:{0}, Name:{1}", ID, Name );
}
}
static void Main( string[] args )
{
Parameter valueA = new Parameter() { ID = 0, Name = "正一郎" };
Parameter valueB = new Parameter() { ID = 5, Name = "清次郎" };
Parameter valueC = new Parameter() { ID = 3, Name = "誠三郎" };
Parameter valueD = new Parameter() { ID = 4, Name = "征史郎" };
Parameter[] dataA = new Parameter[] { valueA, valueB };
Parameter[] dataB = new Parameter[] { valueA, valueB };
Parameter[] dataC = new Parameter[] { valueD };
bool resultAB = dataA.SequenceEqual( dataB );
bool resultAC = dataA.SequenceEqual( dataC );
bool resultBC = dataB.SequenceEqual( dataC );
System.Console.WriteLine( "dataA:{0}", dataA.Text() );
System.Console.WriteLine( "dataB:{0}", dataB.Text() );
System.Console.WriteLine( "dataC:{0}", dataC.Text() );
System.Console.WriteLine( "AB内容是否相同:{0}", resultAB );
System.Console.WriteLine( "AC内容是否相同:{0}", resultAC );
System.Console.WriteLine( "BC内容是否相同:{0}", resultBC );
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:[ID:0, Name:正一郎], [ID:5, Name:清次郎],
dataB:[ID:0, Name:正一郎], [ID:5, Name:清次郎],
dataC:[ID:4, Name:征史郎],
AB内容是否相同:True
AC内容是否相同:False
BC内容是否相同:False
可以得出结论当引用相同时返回True。
那如果我们想比较内容而不是引用该怎么办呢? 这时我们就可以通过创建IEqualityComparer作为SequenceEqual()的第二参数,自定义比较方式。 public static bool SequenceEqual( this IEnumerable first, IEnumerable second, IEqualityComparer comparer );
IEqualityComparer 如下所示。
代码示例:
public static class Program
{
private class Parameter
{
public int ID { get; set; }
public string Name { get; set; }
public override string ToString()
{
return string.Format( "ID:{0}, Name:{1}", ID, Name );
}
}
private class ParameterComparer : IEqualityComparer
{
public bool Equals( Parameter i_lhs, Parameter i_rhs )
{
if( i_lhs.ID == i_rhs.ID &&
i_lhs.Name == i_rhs.Name )
{
return true;
}
return false;
}
public int GetHashCode( Parameter i_obj )
{
return i_obj.ID ^ i_obj.Name.GetHashCode();
}
}
static void Main( string[] args )
{
Parameter[] dataA = new Parameter[]
{
new Parameter() { ID = 0, Name = "正一郎" },
new Parameter() { ID = 5, Name = "清次郎" },
};
Parameter[] dataB = new Parameter[]
{
new Parameter() { ID = 0, Name = "正一郎" },
new Parameter() { ID = 5, Name = "清次郎" },
};
Parameter[] dataC = new Parameter[]
{
new Parameter() { ID = 4, Name = "征史郎" },
};
ParameterComparer comparer = new ParameterComparer();
bool resultAB = dataA.SequenceEqual( dataB, comparer );
bool resultAC = dataA.SequenceEqual( dataC, comparer );
bool resultBC = dataB.SequenceEqual( dataC, comparer );
System.Console.WriteLine( "dataA:{0}", dataA.Text() );
System.Console.WriteLine( "dataB:{0}", dataB.Text() );
System.Console.WriteLine( "dataC:{0}", dataC.Text() );
System.Console.WriteLine( "AB内容是否相同:{0}", resultAB );
System.Console.WriteLine( "AC内容是否相同:{0}", resultAC );
System.Console.WriteLine( "BC内容是否相同:{0}", resultBC );
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:[ID:0, Name:正一郎], [ID:5, Name:清次郎],
dataB:[ID:0, Name:正一郎], [ID:5, Name:清次郎],
dataC:[ID:4, Name:征史郎],
AB内容是否相同:True
AC内容是否相同:False
BC内容是否相同:False