【问题标题】:C# foreach to linqC# foreach 到 linq
【发布时间】:2015-08-31 10:47:12
【问题描述】:

我想知道这段代码是否没有最佳方法。

List<CollectionFormFieldRecord> dataFields = new List<CollectionFormFieldRecord>();
foreach (CollectionRelationModel relation in relations)
{
     foreach (var field in visibleFields)
     {
          if (field.SourceCollectionsID == relation.ChildCollectionID)
            dataFields.Add(field);
     }
}

当一个字段 (visibleFields) 的 SourceCollectionsID 存在于关系列表中时,必须将该字段添加到一个单独的列表中。

我尝试了一些 LINQ,但不知道如何将属性与列表中的属性进行比较。

【问题讨论】:

标签: c# linq foreach


【解决方案1】:

你可以使用 linq 做到这一点

dataFields = (from relation in relations 
                    from field in visibleFields 
                    where field.SourceCollectionsID == relation.ChildCollectionID 
                    select field).Select(field => field).ToList();

但我更喜欢使用 foreaches 代替

【讨论】:

【解决方案2】:

您向我们展示的代码复杂度为 O(N 平方)。尝试使用 .Join 方法,因此由于散列,您将具有接近 O(N) 的复杂性。您应该使用的代码是

dataFields = visibleFields.Join(relations, vF => vF.SourceCollectionsID, r => r.ChildCollectionID, (visibleField, relation) => visibleField).ToList();

为了更好地了解复杂性,请查看我对 this question 的回答

【讨论】:

    【解决方案3】:

    我可以和这个类似

    var dataFields = dataFields .Where(f => relations.Any(r => f.SourceCollectionsID ==r.ChildCollectionID))
                    .ToList()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2023-04-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多