Linq to objects - 使用其他集合中的值搜索集合

时间:2014-08-22 12:12:12

标签: c# linq collections linq-to-objects

我试图搜索SO以寻找与我的情况类似的解决方案和问题。

我有两个对象集合:

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;
    }
}

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

2 个答案:

答案 0 :(得分:2)

为什么不加入?

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
}

答案 1 :(得分:0)

使用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