3

以下のリストを使用して、完全な力ずくの比較を行わずに、以下のリストから個別のリストを取得するにはどうすればよいですか? この例では、list2 と list3 は同一であるため、list1 と list2 のみが必要です。

var list1 = new List<int>{1,2,3,4,5};
var list2 = new List<int>{2,3};
var list3 = new List<int>{3,2};
4

3 に答える 3

3

リストを のコレクションに置き換えますHashSet

その後、書くことができます

hashSets.Distinct(HashSet<int>.CreateSetComparer())
于 2013-06-25T18:40:04.163 に答える
0

EDIT Use List<>.Sort + IEnumerable の .Any および .SequenceEqual

public static List<List<int>> Test1(List<int>[] lists)
{
    var result = new List<List<int>>();
    foreach(var list in lists)
    {
        list.Sort();
        if(!result.Any(elm => elm.SequenceEqual(list)))
            result.Add(list);
    }
    return result;
}

これは、HashSet メソッドと pre-.Sort .Any .SequenceEqual メソッドを示す簡単なベンチマーク/テストです。edit http://ideone.com/x3CJ8Iもちろん、ideone はおそらく最適なベンチマーク プラットフォームではないので、自分のマシンで自由に実行してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;

public class Demo
{
    public static void Main()
    {
        int tries = 100;
        int count = 50;
        int size = 1000;
        Random rnd = new Random();
        List<int>[] list;
        Stopwatch sw;

        sw = new Stopwatch();
        for(int x=0; x<tries; x++)
        {
            list = new List<int>[count];
            for(int y=0; y<count; y++)
            {
                list[y] = new List<int>();
                for(int z=0; z<size; z++)
                {
                    int n = rnd.Next();
                    list[y].Add(n);
                }
                if((y % 5) == 0 && y > 0)
                { // make repeated lists for the uniqueness check
                    list[y-1] = new List<int>(list[y]);
                    list[y-1].Reverse();
                }
            }
            sw.Start();
            Test1(list);
            sw.Stop();
        }
        Console.WriteLine( sw.Elapsed.ToString() );

        sw = new Stopwatch();
        for(int x=0; x<tries; x++)
        {
            list = new List<int>[count];
            for(int y=0; y<count; y++)
            {
                list[y] = new List<int>();
                for(int z=0; z<size; z++)
                {
                    int n = rnd.Next();
                    list[y].Add(n);
                }
                if((y % 5) == 0 && y > 0)
                { // make repeated lists for the uniqueness check
                    list[y-1] = new List<int>(list[y]);
                    list[y-1].Reverse();
                }
            }
            sw.Start();
            Test2(list);
            sw.Stop();
        }
        Console.WriteLine( sw.Elapsed.ToString() );
    }
    public static List<List<int>> Test1(List<int>[] lists)
    {
        var result = new List<List<int>>();
        foreach(var list in lists)
        {
            list.Sort();
            if(!result.Any(elm => elm.SequenceEqual(list)))
                result.Add(list);
        }
        return result;
    }
    public static List<HashSet<int>> Test2(List<int>[] lists)
    {
        var result = new List<HashSet<int>>();
        foreach(var list in lists)
        {
            result.Add(new HashSet<int>(list));
        }
        result = result.Distinct(HashSet<int>.CreateSetComparer()).ToList();
        return result;
    }
}

EDITテストを変更する時間がありましたが、HashSets + .Distinct を作成するオーバーヘッドは、.Sort + .Any + .SequenceEqualの編集とほぼ同じです。http://ideone.com/x3CJ8I

于 2013-06-25T19:10:59.090 に答える