我有以下代码片段,我想转换为LINQ。目标是在内部集合中找到匹配项并返回其Data属性。有什么建议吗?
string data = null;
foreach (var section in sections)
{
foreach (var field in section.Fields)
{
if (field.Id == id)
{
data = field.Data;
}
}
}
答案 0 :(得分:4)
您可以使用SelectMany
展平收藏品,然后使用var matches = sections
.SelectMany(s => s.Fields)
.Where(f => f.Id == id)
.Select(f => f.Data);
matches
现在Single
包含匹配的所有数据字符串。如果您只有一个匹配项,则可以使用SingleOrDefault
(或FirstOrDefault
,如果可能没有)来获取该单个值。如果您可能有更多匹配项,请使用LastOrDefault
或Last
。 (在您的代码中,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()