从 LINQ 查询中获取列表中的第一个项目

8

我希望只获取第一条记录,但是我发现 "Take ()" 方法不起作用。

因此,我有一个查询另一个列表的列表。

List<string> etchList = new List<string>();
etchList.Add("709");

Linq查询是什么?

var query = (from vio in AddPlas
            where etchList.Any(vioID => vio.Key.Formatted.Equals(vioID))
            select new
            {
                EtchVectors = vio.Shapes
            }).ToList().Take(1);

现在这个“Take(1)”只有在etchList中有其他数据时才起作用,所以这不是我想要的。我得到的结果看起来像这样:
格式化
“clinesegs” 1013.98 5142.96 “LYR3_SIG2”
“clinesegs” 1020.16 5168.33 “LYR3_SIG2”
“clinesegs” 967.03 5151.31 “LYR3_SIG2”
“clinesegs” 971.43 5174.01 “LYR3_SIG2”
我希望仅返回列表中的第一行。
"clinesegs" 1013.98 5142.96 "LYR3_SIG2"

编辑:

好的,这段代码已经存在:

public class AddPla
{
public AddPla()
{
    Shapes = new List<Parse>();
}

public Parse Key { get; set; }
public Parse Pla { get; set; }
public Parse Angle { get; set; }
public Parse Default { get; set; }
public List<Parse> Shapes { get; set; }
public Parse DoubleBrace { get; set; }
public Parse Number1 { get; set; }
public Parse Number2 { get; set; }
  }

  public class Parse
  {

public string Formatted { get; set; }
public string Original { get; set; }

  }

然后这个列表。
  var AddPlas = new List<AddPla>();

抱歉,我并不是想“隐藏”任何代码,我最初没有发布它是因为认为它不是那么重要,但你可以看到Shapes是一个List<Parse>类型。 - user2300652
所以,等等,你想从每个“AddPla”中获取第一个“Shapes”? - gunr2171
是的,对此感到抱歉... - user2300652
3个回答

12

我不认为这会像First()那么容易?

如果你预计查询结果不会返回任何结果,使用FirstOrDefault()

更新

如果你想要的是“从每个AddPla获取第一个Shapes”,则将First添加到你的select语句中,而不是最后面。

select new { EtchVectors = vio.Shapes.First() }

1
或者使用 FirstOrDefault() 如果不应该抛出异常。 - Tobias Brandt
First和FirstOrDefault都会给我所有的4个,仍然格式化为: “clinesegs” 1013.98 5142.96 “LYR3_SIG2” “clinesegs” 1020.16 5168.33 “LYR3_SIG2” “clinesegs” 967.03 5151.31 “LYR3_SIG2” “clinesegs” 971.43 5174.01 “LYR3_SIG2” - user2300652
@ChrisHamilton,是的,请更新您的帖子并分享您的新发现。 - gunr2171

5
您可以尝试使用FirstOrDefault
var query = (from vio in AddPlas
            where etchList.Any(vioID => vio.Key.Formatted.Equals(vioID))
            select new
            {
                EtchVectors = vio.Shapes
            }).FirstOrDefault();

2
不需要调用 ToList()FirstOrDefault() 可以很好地操作原始的 IEnumerable<T> - dlev
"clinesegs" 1013.98 5142.96 "LYR3_SIG2" "clinesegs" 1020.16 5168.33 "LYR3_SIG2" "clinesegs" 967.03 5151.31 "LYR3_SIG2" "clinesegs" 971.43 5174.01 "LYR3_SIG2" - user2300652

0
使用FistOrDefault方法安全地返回查询结果中的第一项,如果查询没有返回结果,则返回null:
var result =
    (from vio in AddPlas
     where etchList.Any(vioID => vio.Key.Formatted.Equals(vioID))
     select new
     {
        EtchVectors = vio.Shapes.FistOrDefault()
     })

或者等价地:

var result = AddPlas.Where(x => etchList.Any(y => x.Key.Formatted.Equals(y)))
                    .Select(x => new { EtchVectors = x.Shapes.FistOrDefault() });

@ChrisHamilton 抱歉,我没有看到你的更新问题。我已经更新了我的答案以匹配你最新的规格。 - p.s.w.g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接