如何从集合中获取匹配对象?

时间:2017-11-06 14:08:02

标签: c# linq

我想通过检查集合的id是否与特定id,SelectedProc.Req.SPId匹配来从此集合中获取匹配对象IEnumerable。如何返回匹配对象?

目前,它给了我一个bool而不是匹配的对象。

var opObj = (await dataRepo.GetOperators()) //Returns Task<IEnumerable<Operator>>
    .Where(a => string.Equals(a.ProcType, "ABC", StringComparison.OrdinalIgnoreCase))
    .Select(x => x.ID == SelectedProc.Req.SPId);

1 个答案:

答案 0 :(得分:4)

这是从集合中的每个元素中选择一个特定值:

.Select(x => x.ID == SelectedProc.Req.SPId)

该值为:

x.ID == SelectedProc.Req.SPId

这是一个布尔值。如果您只想要收集本身而不是任何转换,请完全删除.Select()

var opObj = (await dataRepo.GetOperators()) //Returns Task<IEnumerable<Operator>>
    .Where(a => string.Equals(a.ProcType, "ABC", StringComparison.OrdinalIgnoreCase))

或者,如果您希望以前的代码是附加条件,请将其添加为附加条件:

var opObj = (await dataRepo.GetOperators()) //Returns Task<IEnumerable<Operator>>
    .Where(a => string.Equals(a.ProcType, "ABC", StringComparison.OrdinalIgnoreCase))
    .Where(x => x.ID == SelectedProc.Req.SPId)

这将返回一个集合。如果您只想返回单个匹配项,请改用.Single()

var opObj = (await dataRepo.GetOperators()) //Returns Task<IEnumerable<Operator>>
    .Where(a => string.Equals(a.ProcType, "ABC", StringComparison.OrdinalIgnoreCase))
    .Single(x => x.ID == SelectedProc.Req.SPId)

其他选项包括.SingleOrDefault().First().FirstOrDefault()等。

基本上,.Select()会选择所有元素并将其参数应用于转换结果。 .Where()过滤结果。 .Single().First()之类的内容将执行表达式树并从结果中返回一个元素。