簡體   English   中英

使用SelectMany()或使用LINQ(點語法)匹配兩個序列的元素

[英]Using SelectMany() or matching elements of two sequences with LINQ (dot syntax)

我需要從ID屬性包含在第二個集合中的集合中選擇所有元素。 可以使用“ SelectMany()”完成此操作嗎? 對於此類匹配問題,最有效/最佳的解決方案是什么?

示例 :通過聯接實體集為給定的ReportId選擇所有DateRangeId。

套裝

  • 報告 {ReportId,ReportName}
  • ReportDateRanges {DateRangeId,ReportId,ReportDateRangeId}
  • DateRanges {DateRangeId,DateRangeName}

這是我的解決方案的代碼。 我不確定這是否正確,但這確實解決了我描述的問題:

    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專家,請隨時批評此代碼並提供任何建議。 謝謝您的幫助!

好吧,您可以使用Enumerable.Intersect(TSource)方法(IEnumerable(TSource),IEnumerable(TSource),IEqualityComparer(TSource))

例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM