3

これらのエントリを持つ単一の配列があります:

{1, 1, 2, 2, 3,3,3, 4}

そして私はそれらを(この場合は3つのリスト)に変換したいと思います:

{1,2,3,4}
{1,2,3}
{3}

LINQまたはSQLでこれを行う方法はありますか?この操作には数学的な用語があると思いますが、残念ながらわかりません...

それとも、ループでそれを行う必要がありますか?

=======

編集:私は実際にロジックを説明することができないので、ここにもっと多くの例があります..それは多かれ少なかれ配列上で複数回ループし、数字がなくなるまですべての数字を1回(ただし、すべての数字はラウンドごとに1回だけ)取ります

{1、1、2、2、3,3,3、4、5}は{1,2,3,4,5}{1,2,3}{3}になります

また

{1、1、2、2、2、3、3、3、4、5}は{1,2,3,4,5} {1,2,3} {2,3}

4

3 に答える 3

10
private IEnumerable<List<int>> FooSplit(IEnumerable<int> items)
{
    List<int> source = new List<int>(items);
    while (source.Any())
    {
        var result = source.Distinct().ToList();
        yield return result;
        result.ForEach(item => source.Remove(item));
    }
}

使用法:

int[] items =  { 1, 1, 2, 2, 3, 3, 3, 4 };

foreach(var subList in FooSplit(items))
{
    // here you have your three sublists
}

別の解決策を次に示します。これは読みにくくなりますが、パフォーマンスが向上します。

private IEnumerable<IEnumerable<int>> FooSplit(IEnumerable<int> items)
{
    var groups = items.GroupBy(i => i).Select(g => g.ToList()).ToList();    

    while (groups.Count > 0)
    {
       yield return groups.Select( g => 
             { var i = g[0]; g.RemoveAt(g.Count - 1); return i; });
       groups.RemoveAll(g => g.Count == 0);
    }
}
于 2013-01-13T14:33:17.620 に答える
1

これは仕事をします:

    static void Main(string[] args)
    {
        int[] numbers = {1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5};
        List<int> nums = new List<int>(numbers.Length);
        nums.AddRange(numbers);

        while (nums.Count > 0)
        {
            int[] n = nums.Distinct().ToArray();
            for (int i = 0; i < n.Count(); i++)
            {
                Console.Write("{0}\t", n[i]);
                nums.Remove(n[i]);
            }
            Console.WriteLine();
        }

        Console.Read();
    }
于 2013-01-13T14:32:22.910 に答える
1

別のコンソールアプリは次のとおりです。

class Program
{
    class Freq
    {
        public int Num { get; set; }
        public int Count { get; set; }
    }

    static void Main(string[] args)
    {
        var nums = new[] { 1, 1, 2, 2, 3, 3, 3, 4 };
        var groups = nums.GroupBy(i => i).Select(g => new Freq { Num = g.Key, Count = g.Count() }).ToList();
        while (groups.Any(g => g.Count > 0))
        {
            var list = groups.Where(g => g.Count > 0).Select(g => g.Num).ToList();
            list.ForEach(li => groups.First(g => g.Num == li).Count--);
            Console.WriteLine(String.Join(",", list));
        }

        Console.ReadKey();
    }

}
于 2013-01-13T14:37:14.573 に答える