[英]Using SelectMany() or matching elements of two sequences with LINQ (dot syntax)
我需要從ID屬性包含在第二個集合中的集合中選擇所有元素。 可以使用“ SelectMany()”完成此操作嗎? 對於此類匹配問題,最有效/最佳的解決方案是什么?
示例 :通過聯接實體集為給定的ReportId選擇所有DateRangeId。
套裝 :
這是我的解決方案的代碼。 我不確定這是否正確,但這確實解決了我描述的問題:
var report = Reports.Take(1).FirstOrDefault();
int reportId = Convert.ToInt32(report.Id);
var dateRangeIds = ReportDateRanges.Where(rdr => rdr.ReportId == reportId).OrderBy(it => it.DateRangeId).Select(it => it.DateRangeId);
var dateRanges = DateRanges.Where(dateRange => dateRangeIds.Contains(dateRange.Id));
LINQ專家,請隨時批評此代碼並提供任何建議。 謝謝您的幫助!
例如:
var list1 = new List<int> {1,2,3,4,5,6,7,8};
var list2 = new List<int> {9,10,11,12,13,4,5};
list1.Intersect(list2);
結果
4,5
使用鏈接中指定的重載,可以為自定義對象指定EqualityComparer
,以查找兩個枚舉的交集。
希望這可以幫助。
我認為您的代碼簡單易讀,但是有一些不好的地方:
var report = Reports.Take(1).FirstOrDefault();
你可以寫:
var report = Reports.FirstOrDefault();
在這一行:
var dateRangeIds = ReportDateRanges.Where(rdr => rdr.ReportId == reportId)
.OrderBy(it => it.DateRangeId)
.Select(it => it.DateRangeId);
您使用了orderby,但您不需要此功能。
您可以加入收藏集。 假設您具有reportId
,則可以發出此查詢。
Reports
.Where(report => report.ReportId == reportId)
.Join(ReportDateRanges,
report => report.ReportId,
rdr => rdr.ReportId,
(report, reportDateRange) => reportDateRange)
.Join(DateRanges,
rdr => rdr.DateRangeId,
dateRange => dateRange.DateRangeId,
(reportDateRange, dateRange) => dateRange);
這是一種實現方法:
IEnumerable<SomeTypeWithAnIDProperty> sourceSequence = //whatever
IEnumerable<TypeOfTheIDProperty> ids = //whatever
var selectedItems =
from sourceObject in sourceSequence
join id in ids
on sourceObject.ID equals id
select sourceObject;
或者,以您的示例
var dateRangeIds = ReportDateRanges
.Where(rdr => rdr.ReportId == reportId)
.OrderBy(it => it.DateRangeId)
.Select(it => it.DateRangeId);
var dateRanges = DateRanges.Join(dateRangeIds, dateRange => dateRange.Id, id => id, (dateRange, id) => dateRange);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.