Linq到对象——用其他集合的值搜索集合

本文关键字:集合 搜索 对象 Linq 其他 | 更新日期: 2023-09-27 18:19:03

我试图搜索SO的解决方案和问题,可能是类似于我的情况。

我得到了2个对象集合:

public class BRSDocument
{
    public string IdentifierValue { get; set;}
}
public class BRSMetadata
{
    public string Value { get; set;}
}  

我从我的数据层填充列表:

List<BRSDocument> colBRSDocuments = Common.Instance.GetBRSDocuments();
List<BRSMetadata> colBRSMetadata = Common.Instance.GetMessageBRSMetadata();

我现在想在colBRSDocuments中找到一个对象,其中x.IdentifierValue等于colBRSMetadata y.Value中的一个对象。我只需要找到与BRSMetadata对象的值匹配的BRSDocument。

我使用了一个普通的foreach循环和一个简单的linq搜索来查找数据,并在找到值时中断。我想知道搜索是否可以完全用linq完成?

foreach (var item in colBRSMetadata)
{
    BRSDocument res = colBRSDocuments.FirstOrDefault(x => x.IdentifierValue == item.Value);
    if (res != null)
    {
        //Do work
        break;
    }
}

希望你们中的一些人能把我推向正确的方向…

Linq到对象——用其他集合的值搜索集合

为什么不做一个join呢?

var docs = from d in colBRSDocuments
           join m in colBRSMetadata on d.IdentiferValue equals m.Value
           select d;

如果只有一个,那么你可以这样做:

var doc = docs.Single(); // will throw if there is not exactly one element

如果你想同时返回两个对象,那么你可以这样做:

var docsAndData = from d in colBRSDocuments
                  join m in colBRSMetadata on d.IdentiferValue equals m.Value
                  select new
                  {
                      Doc = d,
                      Data = m
                  };

那么你可以这样访问:

foreach (var dd in docsAndData)
{
    // dd.Doc
    // dd.Data
}

使用Linq ?像这样的代码应该可以完成工作:

foreach (var res in colBRSMetadata.Select(item => colBRSDocuments.FirstOrDefault(x =>      x.IdentifierValue == item.Value)).Where(res => res != null))
        {
            //Do work
            break;
        }

如果您只对第一项感兴趣,那么代码将是:

var brsDocument = colBRSMetadata.Select(item => colBRSDocuments.FirstOrDefault(x => x.IdentifierValue == item.Value)).FirstOrDefault(res => res != null);
        if (brsDocument != null)
            //Do Stuff