LINQ查询在另一个List中搜索List并返回值

时间:2017-10-09 14:15:09

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

您好我只是在将一些旧的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();
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

如果你在输出byteData.BytePos上写,那么它将打印&#39; 0&#39;作为号码。

查询内部的内容是什么?

的SelectMany

当我从所有的can ID中选择ByteStuff时,你可以想象一下,在这个语句之后你正在处理集合中的所有ByteStuff集合的集合。

FirstOrDefault

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

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

答案 1 :(得分:1)

使用List<ByteData>将多个SelectMany展平为一个列表。然后选择您需要的元素并访问BytePos。如果未找到匹配元素,请返回null

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

C# Fiddle