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;
}
}
希望你们中的一些人能把我推向正确的方向…
为什么不做一个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