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