您好我只是在将一些旧的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();
}
}
答案 0 :(得分:1)
你的问题的答案是运行这个LINQ表达式:
var byteData = CanIDs
.SelectMany(can => can.ByteStuff)
.FirstOrDefault(byteData => byteData.ByteName == "james");
如果你在输出byteData.BytePos上写,那么它将打印&#39; 0&#39;作为号码。
当我从所有的can ID中选择ByteStuff时,你可以想象一下,在这个语句之后你正在处理集合中的所有ByteStuff集合的集合。
我试图在集合中找到通过给定条件的对象。如果它找不到任何对象,则返回null。
我希望这是你正在寻找的答案。
答案 1 :(得分:1)
使用List<ByteData>
将多个SelectMany
展平为一个列表。然后选择您需要的元素并访问BytePos
。如果未找到匹配元素,请返回null
。
var linqQuery = CanIDs
.SelectMany(c => c.ByteStuff)
.FirstOrDefault(b => b.ByteName == "james")
?.BytePos;