C# 具有上限和下限的动力装置

C# 具有上限和下限的动力装置,c#,linq,C#,Linq,我有一个过程,我需要找到符合特定标准的所有最佳组合。我想我正在寻找的是Powerset,但我想在中内置一些过滤器,以避免数百万个结果 例如,我有以下对象: public class CableReel { public string ReelId { get; set; } public int Length { get; set; } } 我想得到上述对象的功率集,其中组合长度满足下限,同时也满足上限 下表: “a”,5200 “b”,2500

我有一个过程,我需要找到符合特定标准的所有最佳组合。我想我正在寻找的是Powerset,但我想在中内置一些过滤器,以避免数百万个结果

例如,我有以下对象:

public class CableReel
    {
        public string ReelId { get; set; }
        public int Length { get; set; }
    }
我想得到上述对象的功率集,其中组合长度满足下限,同时也满足上限

下表:

“a”,5200 “b”,2500 “c”,1000

我想加入以下限制,最小3000,最大5000。我只想看到BC组合

我找到了以下返回通用电源集的代码:

public IEnumerable<IEnumerable<T>> GetPowerSet<T>(List<T> list)
    {
        return from m in Enumerable.Range(0, 1 << list.Count)
               select
                 from i in Enumerable.Range(0, list.Count)
                 where (m & (1 << i)) != 0
                 select list[i];
    }
public IEnumerable GetPowerSet(列表)
{

从Enumerable.Range(0,1中的m返回假设您的powerset代码工作正常,您可以在调用方法之前筛选列表:

var filteredList = list.Where(e => e > 4000 || e < 5000);
var result = GetPowerSet(filteredList.ToList());
var filteredList=list.Where(e=>e>4000 | | e<5000);
var result=GetPowerSet(filteredList.ToList());
编辑: 因为要过滤的不是元素而是集合,所以可以过滤结果。 此代码演示了如何筛选总和大于2的集合:

    public static IEnumerable<IEnumerable<T>> GetPowerSet<T>(List<T> list,       Func<IEnumerable<T>, Boolean> filter)
    {
        var fullPowerSet = from m in Enumerable.Range(0, 1 << list.Count)
                     select
                       from i in Enumerable.Range(0, list.Count)
                       where (m & (1 << i)) != 0
                       select list[i];

        return fullPowerSet.Where(e => filter(e));
    }

    static void Main(String[] args)
    {
        List<Int32> inputList = new List<Int32>()
        {
            1,2
        };

        var result = GetPowerSet(inputList, ps => ps.Sum() > 1);
    }
公共静态IEnumerable GetPowerSet(列表,Func筛选器)
{
var fullPowerSet=可枚举范围内的m(0,1 ps.Sum()>1);
}

现在,您可以更改委托
ps=>ps.Sum()>1
以获得所需内容。

如果限制max limit等于5000,您如何在结果中获得A(A=5200)?@Alexikilinda我希望筛选的是功率集,而不是初始列表。您希望使用哪些标准来比较功率集与限制?为什么AB是一个好的标准(尽管A+B=5200+2500=7700之和大于最大值=5000)?你如何计算这个标准?我明白你的意思,我已经解决了我的问题。对于3000到5000之间的过滤器,我希望看到CB组合,因为这是这些数字之间唯一的一个。你只能组合两个吗?或者任何n向组合都可以接受吗?例如,如果max是10000,你想看ABC吗?啊,那不是正是我在寻找的,我在寻找,我在寻找,我在寻找组合的极限。因此,对于这三个,我希望组合在极限范围内。我希望它与对象一起工作,但我似乎无法让它工作:var ls=new List{new CableReel{Length=5,ReelId=“A”},new CableReel{Length=3,ReelId=“B”},new CableReel{Length=2,ReelId=“C”};var p=GetPowerSet(ls,ps=>ps.Length.Sum()>=6);我用:GetPowerSet(ls).Where(psl=>psl.Sum(ps=>ps.Length)>5&&psl.Sum(ps=>ps.Length)<8);
    public static IEnumerable<IEnumerable<T>> GetPowerSet<T>(List<T> list,       Func<IEnumerable<T>, Boolean> filter)
    {
        var fullPowerSet = from m in Enumerable.Range(0, 1 << list.Count)
                     select
                       from i in Enumerable.Range(0, list.Count)
                       where (m & (1 << i)) != 0
                       select list[i];

        return fullPowerSet.Where(e => filter(e));
    }

    static void Main(String[] args)
    {
        List<Int32> inputList = new List<Int32>()
        {
            1,2
        };

        var result = GetPowerSet(inputList, ps => ps.Sum() > 1);
    }