1

検索機能の結果であるデータベースから大量のデータを取得しました。これList<string[]>で、 type の要素が重複していますstring[]。リストのstring[]は検索結果です。

新しく作成されたすべての配列には異なるインスタンスがあることを知っているので、使用できませんMyListOfArrays.Distinct().ToList()

多分それは非常に基本的な質問です...

string[]私の質問は、重複したフォームを削除するために組み込まれている関数はありますList<string[]>か? それとも自分で書かなければなりませんか?

ありがとうございました

4

3 に答える 3

2

@Muctadir Dinar からの回答を修正しました。

(彼はその答えの功績に値する - 私はそれを修正し、完全なテスト プログラムを提供しているだけです):

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();
        }
    }
}
于 2013-10-01T14:44:08.650 に答える
1

単純であまり効率的ではないアプローチは、次のように使用string.Joinすることstring[]です。

list = list
.GroupBy(strArr => string.Join("|", strArr))
.Select(g => g.First())
.ToList();
于 2013-10-01T14:22:25.390 に答える