2016-07-16 38 views
1

我有一個結構是這樣的:Linq查詢,保持參照嵌套集合,其中項目被發現

class Action 
{ 
    uint ActionId; 
} 

class Trigger 
{ 
    public List<Action> Actions; 
} 

class Sequence 
{ 
    public List<Trigger> Triggers; 
} 

我需要獲得一些ActionId的行動,同時也保留了觸發的引用包含它。主要是:

foreach (Trigger checkTrigger in Triggers) 
{ 
    foreach (Action checkAction in checkTrigger.Action) 
    { 
     if (checkAction.ActionId == actionId) 
     { 
      action = checkAction; 
      trigger = checkTrigger; 
      break; 
     } 
    } 
    if (null != action) break; 
} 

剛剛獲得的動作很簡單:

Action action = Triggers 
        .SelectMany(t => t.Actions) 
        .FirstOrDefault(a => a.ActionId == actionId); 

但我怎麼會獲得包含它的觸發?很顯然,與上述不同,因爲它將Actions列表合併爲一個集合,然後再搜索它。

回答

0

行動和觸發值獲得一起在匿名類型:

var actionAndTrigger = (from t in sequence.Triggers 
         from a in t.Actions 
         where a.ActionId == actionId 
         select new { Trigger = t, Action = a }) 
         .FirstOrDefault(); 

如果匿名類型不適合 - 例如,需要將數據傳遞給另一個方法 - 你應該創建一個類具有兩個性能和使用它:

class ActionTrigger 
{ 
    public Action Action { get; set; } 
    public Trigger Trigger { get; set; } 
} 

var actionAndTrigger = (from t in sequence.Triggers 
         from a in t.Actions 
         where a.ActionId == actionId 
         select new ActionTrigger { Action = a, Trigger = t }) 
         .FirstOrDefault(); 

您可以使用,而不是引入額外的類元組:

var actionAndTrigger = (from t in sequence.Triggers 
         from a in t.Actions 
         where a.ActionId == actionId 
         select Tuple.Create(t, a)) 
         .FirstOrDefault(); 
+0

感謝。沒有匿名類型可以這樣做嗎?說分配給以前聲明的變量? – FlintZA

+0

@FlintZA - 用兩個屬性創建你自己的類並使用它。另一種方法 - 使用'Tuple '。 –

+0

謝謝,我會給你一個鏡頭。 – FlintZA

0

你可以使用兩個查詢單獨提取TriggerActionId爲如下:

var trig = seq.Triggers.First(x => x.Actions.Any(y => y.ActionId == actionId)); 
var act = seq.Triggers.Select(x => x.Actions.Any(y => y.ActionId == actionId)).First();