C# 您需要删除整个重复列表,还是只需要删除重复的字符串?整个重复列表。每次都是一个具有相同值的数组。恐怕这不起作用,因为即使对于相同的序列,GetHashCode()也会返回不同的值。GetHashCode是否在数组类中实现?是的,在实现此函数后,我得到了相同

C# 您需要删除整个重复列表,还是只需要删除重复的字符串?整个重复列表。每次都是一个具有相同值的数组。恐怕这不起作用,因为即使对于相同的序列,GetHashCode()也会返回不同的值。GetHashCode是否在数组类中实现?是的,在实现此函数后,我得到了相同,c#,arrays,list,C#,Arrays,List,您需要删除整个重复列表,还是只需要删除重复的字符串?整个重复列表。每次都是一个具有相同值的数组。恐怕这不起作用,因为即使对于相同的序列,GetHashCode()也会返回不同的值。GetHashCode是否在数组类中实现?是的,在实现此函数后,我得到了相同的列表。使用这个:public int GetHashCode(string[]obj){int hash=17;foreach(obj中的字符串s)hash=hash*23+s.GetHashCode();return hash;}@Matt



您需要删除整个重复列表,还是只需要删除重复的字符串?整个重复列表。每次都是一个具有相同值的数组。恐怕这不起作用,因为即使对于相同的序列,
GetHashCode()
也会返回不同的值。GetHashCode是否在数组类中实现?是的,在实现此函数后,我得到了相同的列表。使用这个:public int GetHashCode(string[]obj){int hash=17;foreach(obj中的字符串s)hash=hash*23+s.GetHashCode();return hash;}@MatthewWatson也检查空值。我担心这不起作用,因为
GetHashCode()
即使对于相同的序列,也会返回不同的值。GetHashCode是否在数组类中实现?是的,我在实现此函数后得到了相同的列表。请使用:public int GetHashCode(string[]obj){int hash=17;foreach(obj中的字符串s)hash=hash*23+s.GetHashCode();return hash;}@MatthewWatson也检查空值。非常好。谢谢你。编辑:接受了Muctadir Dinar的答案。@Patrick为什么你会接受一个完全错误的答案,其中有几个主要错误阻止了它的工作,并且需要进行非琐碎的更改才能修复?@Servy我的错是这么说的“他的回答值得称赞,”我想.)我这么说是因为我不想“偷”"提供IEqualityComparer实现的想法。@Servy我只是遵循了Metthew Watson的建议,他在文章的第二行写道。你应该在
getHashCode
中的
foreach
中使用
unchecked
。非常好。谢谢你这么做。编辑:接受了Muctadir Dinar的答案。@Patrick Why w你能接受一个完全不正确的答案吗?有几个严重的错误会使它无法工作,并且需要进行非琐碎的修改才能修复?@Servy我的错是说“他的答案值得表扬”,我想。;)我这么说是因为我不想“偷”提供IEqualityComparer实现的想法。@Servy我只是遵循了Metthew Watson的建议,他在文章的第二行写道。你应该在
getHashCode
中的
foreach
周围加上
未选中的
。如果字符串中有
值,这可能会有问题o该
{“a | b”}
等于
{“a”,“b”}
@Servy:是的,这就是我所说的
简单
。可能足够了,也可能不够。因此,如果输入不是任意的,你可以选择一个不能出现的分隔符。我的观点是,它不仅慢。如果总是正确的,但可能慢,你只需要关心大量的数据。当它不总是正确的时候,它就是一个mu更大的问题是它是否可以在任何给定的情况下使用。如果字符串中有
值,这可能会有问题。根据这个
{“a | b”}
等于
{“a”,“b”}
@Servy:是的,这就是我所说的
简单
。可能足够了,也可能不够。因此,如果输入不是任意的,你可以选择一个不能出现的分隔符。我的观点是,它不仅慢。如果总是正确的,但可能慢,你只需要关心大量的数据。当它不总是正确的时候,它就是一个mu更大的问题是,它是否可以用于任何特定的情况。
list = list
.GroupBy(strArr => string.Join("|", strArr))
.Select(g => g.First())
.ToList();
    IEnumerable<string[]> distinct = inputStringArrayList.Distinct(new EqualityComparer());
class EqualityComparer : IEqualityComparer<string[]>
{
    public bool Equals(string[] x, string[] y)
    {
        if (x.Length != y.Length)
        {
            return false;
        }
        if (x.Where((t, i) => t != y[i]).Any())
        {
            return false;
        }
        return true;
    }

    public int GetHashCode(string[] obj)
    {
        return obj.GetHashCode(); 
    }
}
public bool Equals(string[] x, string[] y)
{
    return x.SequenceEqual(y);
}
public int GetHashCode(string[] obj)
        {
            if (obj == null)
                return 0;

            int hash = 17;

            unchecked
            {
                foreach (string s in obj)
                    hash = hash*23 + ((s == null) ? 0 : s.GetHashCode());
            }

            return hash;
        }
using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    sealed class EqualityComparer: IEqualityComparer<string[]>
    {
        public bool Equals(string[] x, string[] y)
        {
            if (ReferenceEquals(x, y))
                return true;

            if (x == null || y == null)
                return false;

            return x.SequenceEqual(y);
        }

        public int GetHashCode(string[] obj)
        {
            if (obj == null)
                return 0;

            int hash = 17;

            unchecked
            {
                foreach (string s in obj)
                    hash = hash*23 + ((s == null) ? 0 : s.GetHashCode());
            }

            return hash;
        }
    }

    class Program
    {
        private void run()
        {
            var list = new List<string[]>
            {
                strings(1, 10), 
                strings(2, 10), 
                strings(3, 10), 
                strings(2, 10), 
                strings(4, 10)
            };

            dump(list);
            Console.WriteLine();

            var result = list.Distinct(new EqualityComparer());
            dump(result);
        }

        static void dump(IEnumerable<string[]> list)
        {
            foreach (var array in list)
                Console.WriteLine(string.Join(",", array));
        }

        static string[] strings(int start, int count)
        {
            return Enumerable.Range(start, count)
                .Select(element => element.ToString())
                .ToArray();
        }

        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}