C# 一个数组集合,任意组合,并且不重复

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace listTst
{
    class Program
    {
        static void Main(string[] args)
        {
            var sw = Stopwatch.StartNew();
            var array = new List<Storage>()
            {
                new Storage{ Id = 1, Name = "A" },
                new Storage{ Id = 2, Name = "B" },
                new Storage{ Id = 3, Name = "C" },
                new Storage{ Id = 4, Name = "D" },
                new Storage{ Id = 5, Name = "E" },
                new Storage{ Id = 6, Name = "F" },
                new Storage{ Id = 7, Name = "G" },
                new Storage{ Id = 8, Name = "H" },
                new Storage{ Id = 9, Name = "I" },
            };

            var result = new List<Group>();
            array.ForEach(a => { result.Add(new Group(a)); });
            for (int count = 2; count <= array.Count; count++)
            {
                Test(result, array, 0, count);
            }
            sw.Stop();

            foreach (var group in result)
            {
                Console.WriteLine(group.Name);
            }
            Console.WriteLine($"组合数量:{result.Count}");
            Console.WriteLine($"耗时:{sw.ElapsedMilliseconds}ms");
            Console.ReadLine();
        }

        static void Test(List<Group> result, List<Storage> array, int begin, int count)
        {
            var list = new List<Storage>();
            var end = begin + count - 1;
            if (end > array.Count) return;
            for (int i = begin; i < end; i++)
            {
                list.Add(array[i]);
            }
            if (list.Count < count)
            {
                for (int index = end; index < array.Count; index++)
                {
                    var group = new Group(list);
                    group.Storages.Add(array[index]);
                    result.Add(group);
                }
            }

            if (++begin < array.Count) Test(result, array, begin, count);
        }

        class Group
        {
            public Group(Storage storage)
            {
                Storages.Add(storage);
            }
            public Group(List<Storage> list)
            {
                Storages.AddRange(list);
            }
            public string Name => string.Concat(Storages.Select(a => a.Name));
            public List<Storage> Storages = new List<Storage>();
        }

        class Storage
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
    }
}

原文地址:https://www.cnblogs.com/chxl800/p/11232616.html

时间: 2024-10-10 10:30:47

C# 一个数组集合,任意组合,并且不重复的相关文章

如何实现一个数组所有的组合????

比如一个数组(1,2,3),如何实现所有的排列组合,如下所示: (1) (2) (3) (1,2) (1,3) (2,3) (1,2,3) Delphi/Pascal codefunction TestBit(Value, Index : integer) : Boolean;asm BT EAX, EDX SBB EAX, EAX AND EAX, 1end; procedure TForm1.Button1Click(Sender: TObject);const A : array[0..4

向一个数组中添加100个不重复的随机数的几个方法

import java.util.Arrays; class Input100 { public static void main(String[] args) { int[] arr = new int[100]; arr[0]=(int)(Math.random()*100+1); boolean flag = true; a:while(flag){ for(int i = 0;i < arr.length;i++){ for (int j = 0;j < i ;j++ ) { if (

python 给定数组任意组合等于一个定值的所有解

抛出问题: 求给定数组任意组合等于一个定值的所有解 例如列表l = [1, 2, 3, 4, 5],求任意组合的结果为10的所有答案 问题分析: 实际就是列表的所有排列组合,然后算出每个排列组合的值,记录等于所求值的组合结果. 代码实现就是先生成和 l 等长的全0列表,0表示,列表该位置数不取,1表示列表该位置数取,就这样一直递归,一直到全1 # -*- coding:utf-8 -*- # 日期:2018/6/11 7:30 # Author:小鼠标 # 求给定数组任意组合等于一个定值的所有解

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。 牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。 这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等.问是否可行.牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍.这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次.输入描述: 输入一个正整数N (N <= 50) 接下来一行输入N个正整数,每个数均小于等于1e9. 输出描述: 假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO" 输入例子: 2 1 2 输出例子: YES

一道小题:从一个数组里产生所有可能的乘积组合

比如给定一个数组[2,3,11] 要求产生[1,2,3,6,11,22,33,66] 观察可得:[2,3] 产生了[1,2,3,6] 的乘积可能.当加入11时,11会和现有的每一个元素都相乘得到[1,2,3,6,11,22,33,66] public static void allProducts(int[] arr) { List<Integer> list = new ArrayList<Integer>(); list.add(1); for(int i=0; i<ar

面试题3:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

package siweifasan_6_5; /** * @Description:在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. * @Parameters: // Parameters: // numbers: an array of integers //

Codeforces Round #283 (Div. 2) A. Minimum Difficulty【一个数组定义困难值是两个相邻元素之间差的最大值。 给一个数组,可以去掉任意一个元素,问剩余数列的困难值的最小值是多少】

A. Minimum Difficulty time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Mike is trying rock climbing but he is awful at it. There are n holds on the wall, i-th hold is at height ai off the g

4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。 (2)把数组中的数字放到当前文件夹的numArr.txt文件中

package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; /* * 4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台. (2)把数组中的数字放到当前文件夹的number.txt文件中 */ public class Test4 { public static void main

C# 委托:把方法组合到一个数组中使用

C# 委托:把方法组合到一个数组中使用 2016年04月28日 16:12:55 kernel_main 阅读数 1129 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class MathOperations { public static double MultiplyByTwo(double value