LINQ之SequenceEqual

返回LINQ大全首页

SequenceEqual()

SequenceEqual()用于判断两个序列中的内容是否一致。

public static bool SequenceEqual<TSource>( this IEnumerable<TSource> first, IEnumerable<TSource> 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<int>   dataC   = new List<int> { 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<TSource>( this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> 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<Parameter>
    {
        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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值