使用LINQ在嵌套集合中查找值

时间:2017-02-23 00:39:45

标签: c# linq

我有以下代码片段,我想转换为LINQ。目标是在内部集合中找到匹配项并返回其Data属性。有什么建议吗?

    string data = null;
    foreach (var section in sections)
    {
        foreach (var field in section.Fields)
        {
            if (field.Id == id)
            {
                data = field.Data;
            }
        }
    }

2 个答案:

答案 0 :(得分:4)

您可以使用SelectMany展平收藏品,然后使用var matches = sections .SelectMany(s => s.Fields) .Where(f => f.Id == id) .Select(f => f.Data);

进行展开
matches

现在Single包含匹配的所有数据字符串。如果您只有一个匹配项,则可以使用SingleOrDefault(或FirstOrDefault,如果可能没有)来获取该单个值。如果您可能有更多匹配项,请使用LastOrDefaultLast。 (在您的代码中,data = sections .SelectMany(s => s.Fields) .SingleOrDefault(f => f.Id == id) ?.Data; 是为您提供相同答案的方法)

你可以将所有这些放在一起并简化:

?

请注意function exampleController($scope, exampleFactory, $timeout) { $scope.list = []; $scope.listContainerWidth = '???'; $scope.refreshList = function() { $scope.list = []; $scope.listContainerWidth = '???'; $scope.listContainerWidth = document.querySelector('.ul').clientWidth; $timeout(function() { getList(); }, 1000); }; function getList() { exampleFactory .getList() .then(function(list) { $scope.list = list; }); } getList(); } function exampleFactory($http) { var root = 'http://jsonplaceholder.typicode.com'; function getList() { return $http.get(root + '/comments') .then(function(resp) { return resp.data; }); } return { getList: getList }; } angular .module('app', []) .controller('exampleController', exampleController) .factory('exampleFactory', exampleFactory);以防万一没有匹配。

答案 1 :(得分:0)

根据Rob的评论,以下代码可行:

sections.SelectMany(x => x.Fields).Where(field => field.Id == id).Select(field => field.Data).FirstOrDefault()