GVKun编程网logo

鉴于选择了至少一个位置,从列表中计算组合

12

以上就是给各位分享鉴于选择了至少一个位置,从列表中计算组合,同时本文还将给你拓展c#–从列表中选择、c#–从列表中选择值、c#–使用Linq,从列表中获取另一个列表中的所有项目、C#–根据与另一个列表

以上就是给各位分享鉴于选择了至少一个位置,从列表中计算组合,同时本文还将给你拓展c# – 从列表中选择、c# – 从列表中选择值、c# – 使用Linq,从列表中获取另一个列表中的所有项目、C# – 根据与另一个列表的部分交集从列表中选择特定项目(Linq Lambda)等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

鉴于选择了至少一个位置,从列表中计算组合

鉴于选择了至少一个位置,从列表中计算组合

如何解决鉴于选择了至少一个位置,从列表中计算组合?

我有一个子位置的向量“vec”。父位置是(Town Ext、Chowk、Town Market)

import io.estatico.newtype.macros.newtype
import io.estatico.newtype.ops._

@newtype case class Email(string: String)
object Email {
  implicit val ordering: Ordering[Email] = deriving
}
@newtype case class PhoneNumber(string: String)
object PhoneNumber {
  implicit val ordering: Ordering[PhoneNumber] = deriving[Ordering].reverse
}
case class Person(name: String,emails: List[Email],phones: List[PhoneNumber]) {
  lazy val orderValues: Person = this.copy(emails = emails.sorted,phones = phones.sorted)
}

Person(
  "Xiao",List(Email("a@a.a"),Email("a@a.b"),Email("a@b.a")),List(PhoneNumber("+86 100 9000 1000"),PhoneNumber("+86 100 2000 1000"))
).orderValues

当我应用 Parent_Location_Name Sub_Location_Name 0 Town Ext Town Ext_1 1 Town Ext Town Ext_2 2 Town Ext Town Ext_3 3 Town Market Town Market_1 4 Town Market Town Market_2 5 Town Market Town Market_3 6 Town Market Town Market_4 7 Town Market Town Market_5 8 Chowk Chowk_1 9 Chowk Chowk_2 10 Chowk Chowk_3 11 Chowk Chowk_4 vec=[''Town Ext_1'',''Town Ext_2'',''Town Ext_3'',''Town Market_1'',''Town Market_2'',''Town Market_3'',''Town Market_4'',''Town Market_5'',''Chowk_1'',''Chowk_2'',''Chowk_3'',''Chowk_4''] vec [''Town Ext_1'',''Chowk_4''] 时,它给出了所有组合,但我想要的是每个位置必须选择一次。组合不应涉及 (''Town Market_4'',''Chowk_3'') 因为子位置 chowk 已被选择三次并且我们完全排除了 Town Ext Parent 位置。它应该是 (''Town Market_4'',''''Town Ext_1'''',''Chowk_3'') 或 (''Town Market_4''、''''Town Ext_1''''、''Chowk_2''、''Town Ext_2'')等。我必须至少涉及所有父位置一次。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

c# – 从列表中选择

c# – 从列表中选择

我确定有一种很好的方法可以做到这一点(我猜测其中一种扩展方法?),但我很难在Google上找到它.

基本上我有一个自定义类列表;我想从中选择一些项目到一个新的List中,其中一个属性等于另一个List中的任何值.

这是我正在尝试做的一个(简化)快速示例:

public class Job
    {
        public int Number;
        public string ClientCompanyName;            
    }

List<Job> lstJobs = new List<Job>();
List<Job> lstCompare = new List<Job>();

通常我会这样做:

List<Job> lstFiltered = new List<Job>();
foreach(Job jobThis in lstCompare)
{
    foreach(jobComp in lstCompare)
    {
        if(jobThis.Number = jobComp.Number)
        {
            lstFiltered.Add(jobThis);
        }
    }
}

是否有一种扩展方法可以将最后一位加入(理想情况下)单行?

干杯

解决方法

var lstFiltered = lstJobs
        .Where(job => lstCompare.Any(item => item.Number == job.Number))
        .ToList();

如果lstCompare中的项目数量很少,则上述解决方案很有效.对于更大的比较列表,您可能希望使用一些基于散列的集合.

var compareSet = new HashSet<int>(lstCompare.Select(item => item.Number));
var lstFiltered = lstJobs
        .Where(job => compareSet.Contains(job.Number))
        .ToList();

如果比较条件更复杂或者在几个地方需要它,则应创建一个实现IEqualityComparer< T>的比较器类.然后你可以像其他人已经建议的那样使用Intersect()方法.但是,它在功能上与上述解决方案不同.当我的解决方案返回所有匹配元素时,它只返回不同的元素在某些应用中,这可能是一个显着的差异.

我的第二个例子可以很容易地改为使用IEqualityComparer< T>如有必要. HashSet< T>将比较器作为第二个参数.

c# – 从列表中选择值

c# – 从列表中选择值

我有以下列表:
public class Products
{
 public string SKU;
 public int WarehouseID;
}

List<Products> products = new List<Products>();

在填写列表之后,我得到以下数据:

ProductCode|WarehouseID
SKU001|2
SKU001|3
SKU002|3
SKU003|3
SKU004|1
SKU004|5

我有多个SKU的项目可以从多个仓库位置提供,因为它有库存.在SKU001的情况下,仓库ID 2的库存比仓库ID 3多.

我需要从最少数量的仓库位置选择项目.我想要结束的就是这样

SKU001|3
SKU002|3
SKU003|3
SKU004|1

这将产品选择限制为只有2个位置,如SKU001,SKU002& SKU003都可以从仓库ID 3获得.理想地从库存最多但限制位置的位置选择更重要.

我正在使用Linq尝试实现这一点,同时尝试循环每个List项目,但是正在努力,因为Linq对我来说不是一个强项.我试图首先得到重复仓库ID使用的最高数量

products.GroupBy(i => i).OrderByDescending(grp => grp.Count()).Select(grp => grp.Key).FirstOrDefault();

但是其余的项目却迷失了.有什么想法,我可以如何解决这个问题?

解决方法

您可以在多个语句中执行此操作,首先在每个仓库中获取WarehouseID以及不同的产品,其数量如下所示:
var query = products.GroupBy(r => r.WarehouseID)
                    .Select(grp => new
                    {

                        WarehouseID = grp.Key,distinctProducts = grp.Select(r => r.SKU).distinct(),distinctCount = grp.Select(r => r.SKU).distinct().Count(),});

稍后创建一个结果列表,如:

List<Products> result = new List<Products>();

foreach (var item in query.OrderByDescending(r => r.distinctCount)) //warehouse with most products
{
    if (!result.Any(r => item.distinctProducts.Any(t => t == r.SKU)))
    {
        result.AddRange(item.distinctProducts.Select(r => new Products { SKU = r,WarehouseID = item.WarehouseID }));
    }
}

输出:

foreach (var item in result)
{
    Console.WriteLine("{0} | {1}",item.SKU,item.WarehouseID);
}

输出:

SKU001 | 3
SKU002 | 3
SKU003 | 3
SKU004 | 1

c# – 使用Linq,从列表中获取另一个列表中的所有项目

c# – 使用Linq,从列表中获取另一个列表中的所有项目

我有以下场景:
int:List< int>的列表idsOnly = new List< int>();
和另一个对象列表,它应该带来所有项目,它们的ID与列表idsOnly匹配

var myList = db.Items.Where(item => idsOnly.Contains(item.ID.Value))
                     .Select(a => new { a.Title })
                     .ToList();

我只需要从myList中获取标题

任何帮助将不胜感激

解决方法

您的代码有效但它将创建匿名对象列表,而不是字符串类型

如果你只想获得标题,而不是使用(a => new {a.Title},你只需使用a => a.Title:

var myList = db.Items.Where(item => idsOnly.Contains(item.ID.Value))
                     .Select(a => a.Title).ToList();

C# – 根据与另一个列表的部分交集从列表中选择特定项目(Linq Lambda)

C# – 根据与另一个列表的部分交集从列表中选择特定项目(Linq Lambda)

我有两个清单:

List<objA> list1
List<objB> list2

class objA
{
   string Name;
}

class objB
{
   string Name;
   bool SomeProp;
}

使用C#linq / lambda我想选择所有objA对象,其Name属性等于第二个obj(list1.Name == list2.Name)的name属性,并检查objB的另一个属性(list2.someProp == true ).

解决方法

我建议使用join:

from a in list1
join b in list2 on a.Name equals b.Name
where b.someProp
select a

Lambda语法:

list1.Join(listb.Where(b => b.someProp),a => a.Name,b => b.Name,(a,b) => a)

注意:因此,您将避免枚举list1中的每个项目的list2集合(使用Any的解决方案)

为了显示两个解决方案之间的区别 – 让我们看看在将linq转换为plain循环后它们的样子.首先是

list1.Where(a => list2.Any(b => b.Name == a.Name && b.someProp))

它相当于

foreach(var a in list1)
{
   foreach(var b in list2)
   {
       if (a.Name == b.Name && b.someProp)
       {
           yield return a;
           break;
       }
   }
}

如您所见 – 它具有嵌套循环,复杂度为O(N * M).通过join,我们为内部序列创建了Lookup:

Lookup<string,objB> lookup = list2.Where(b => b.someProp).ToLookup(b => b.Name);

foreach(var a in list1)
{
    Grouping<string,objB> g = lookup.GetGrouping(a.Name);
    if (g == null)
       continue;

    foreach(var b in g)
       yield return a;
}

这里的区别是在查找中搜索 – 这是O(1)操作.总复杂度为O(M N)

关于鉴于选择了至少一个位置,从列表中计算组合的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于c# – 从列表中选择、c# – 从列表中选择值、c# – 使用Linq,从列表中获取另一个列表中的所有项目、C# – 根据与另一个列表的部分交集从列表中选择特定项目(Linq Lambda)等相关知识的信息别忘了在本站进行查找喔。

本文标签: