在列表中查找包含在另一个类子列表中的元素

本文关键字:列表 元素 包含 查找 另一个 | 更新日期: 2023-09-27 18:08:13

你能帮我得到更多的性能和更可读的代码为这段代码吗?

var prd = new List<Prodotti>();
foreach (var prodotto in db.Prodotti)   
    foreach (var prdId in prdIdx)       
        if (prdId._idProdotto == prodotto.IDProdotto)           
            foreach (var prodottoSeriali in prodotto.AllSerialNumbers)              
                if (prdId.SerialNumber == prodottoSeriali)
                     if (prdId.SerialNumber == prodottoSeriali)                                
                                if (prd.Count(c => c.IDProdotto == prdId._idProdotto) == 1)
                                    prd.Single(c => c.IDProdotto == prdId._idProdotto).SerialNumbers.Add(prdId.SerialNumber);
                                else
                                {
                                    var tmpprd = new Prodotti()
                                    {
                                        IDProdotto = prodotto.IDProdotto,
                                        ...
                                        Descrizione = prodotto.Descrizione,
                                    };
                                       tmpprd.SerialNumbers.Add(prdId.SerialNumber);
                                    prd.Add(tmpprd);
                                }

db。装饰:

public partial class Prodotti
{
    public int IDProdotto { get; set; }
    public List<string> SerialNumbers { get; set; }
    public List<string> AllSerialNumbers
    {
        get
        {
          return cfgDb.getSerialByProduct(this.IDProdotto)                   .Select(c => c.SerialNumber).ToList();
        }

而prdIdx是List

public class cfgProdotti_Noleggio : cfgClass
{
    public int idseriale { get; set; }
    public int _idProdotto { get; set; }
    public string SerialNumber { get; set; }

我试着用linq翻译它,但没有成功:

var prd = db.Prodotti.ToList()
Where(t2 => prdIdx.Any(t1 => t1._idProdotto== t2.IDProdotto))
.ToList();

在列表中查找包含在另一个类子列表中的元素

您可能想要在您的Prodotti列表中执行SelectMany以使其成为一个:

var l = db.Prodotti.SelectMany(p => p.SerialsNumbers). 

然后你有一个SerialNumbers列表。然后将此列表与您的prdIdx:

相交。
var result = prdIdx.Select(m => m.SerialNumber).Intersect(l);

结果变量是一个公共SerialNumber的IEnumerable(如果你想要一个列表,调用.ToList())

注意:未测试的代码

基于注释:

var result = db.Prodotti.Where(p => prdIdx.Any(s => p.SerialsNumbers.Contains(s.SerialNumber));