【问题标题】:LINQ Query search List within another List and return valueLINQ 查询在另一个列表中搜索列表并返回值
【发布时间】:2018-03-20 18:55:56
【问题描述】:

您好,我只是想在将一些旧的 Javascript 代码重写为 C# 之前让结构正确。

我有一个 CanDetails 列表,我需要能够在其中搜索 ByteName 并获取其 BytePos 值。

我正在为能够使用我的 linqQuery 提取 BytePos 的查询而苦苦挣扎,我希望只有在可能的情况下才能获得返回的整数值。

我在 LinQ 上的尝试简化了下面的示例。

问题是我在结果中返回了一个 CanDetails 对象,但仍需要在其中再次搜索以找到我正在寻找的 BtyePos。

非常感谢。

    public class ByteData
{
    public string ByteName { get; set; }
    public int BytePos { get; set; }
}

public class CanDetails
{
    public string CanName { get; set; }
    public int CanID { get; set; }
    public List<ByteData> ByteStuff { get; set; }
    public int[] RawData { get; set; }
}

public class test
{
    public static void Main()
    {
        List<CanDetails> CanIDs = new List<CanDetails>();

        CanIDs.Add(new Models.CanDetails()
        {
            CanName = "test",
            CanID = 11,
            ByteStuff = new List<ByteData>() {
                new ByteData { ByteName = "james", BytePos = 0 },
                new ByteData { ByteName = "bob", BytePos = 1 },
            },
            RawData = new int[8] { 0, 1, 2, 3, 4, 5, 6, 7 }
        });

        var linqQuery = CanIDs.Where(o => o.ByteStuff.Any(x => x.ByteName == "james")).Select(x => x.ByteStuff).First();
    }
}

【问题讨论】:

  • 这段代码有什么问题?它有任何错误吗?你得到什么意想不到的输出?你期待什么输出?
  • @ChetanRanpariya 代码有效,但我无法在 CanID 中的 ByteName 上运行 Linq 查询搜索并返回找到的 BytePosition。最后一行 Var linqQuery 是我苦苦挣扎的地方。
  • 它有什么错误吗?您在linqQuery 中获得了什么价值?
  • @SamIam 将返回一个 CanDetails 对象,我仍然需要搜索该对象以找到针对 ByteName 进行初始搜索的 BytePos
  • 这可能不是最优雅的方式,但它似乎有效:var linqQuery = CanIDs.Select(o =&gt; o.ByteStuff.Where(x =&gt; x.ByteName == "james")).First().First().BytePos;

标签: c# list linq asp.net-mvc-5


【解决方案1】:

你的问题的答案是运行这个 LINQ 表达式:

var byteData = CanIDs
                .SelectMany(can => can.ByteStuff)
                .FirstOrDefault(byteData => byteData.ByteName == "james");

如果您在输出 byteData.BytePos 上写入,那么它将打印 '0' 作为数字。

查询内部发生了什么?

多选

当我从您所有的罐头 ID 中选择 ByteStuff 时,您可以想象,在此声明之后,您正在处理的集合是您列表中所有 ByteStuff 集合的联合。

FirstOrDefault

我试图在集合中找到通过给定条件的对象。如果找不到任何对象,则返回 null。

我希望这是您正在寻找的答案。

【讨论】:

  • 感谢您花时间回复,但我明确地试图在一个查询中返回 BytePos。
【解决方案2】:

使用SelectMany 将多个List&lt;ByteData&gt; 展平为一个列表。然后选择您需要的元素并访问BytePos。如果没有找到匹配的元素,返回null

 var linqQuery = CanIDs
     .SelectMany(c => c.ByteStuff)
     .FirstOrDefault(b => b.ByteName == "james")
     ?.BytePos;

C# Fiddle

【讨论】:

  • 谢谢 Georg,这很有效,并且还捕获了我通常会使用的默认 Null。
  • 很高兴我能帮忙:)
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多