2011-03-01 110 views
0

我開始使用LINQ,這是我的代碼片段。LINQ:尋找一個想法

var filterList = new List<string>() 
      { 
       "ACRating", 
       "Axles", 
       "SafetyCodes", 
       "BuiltInFeatures" 
      } 

foreach(var i in filterList) 
{ 
    var filter = i; 
    var xList = Vehicles.FilterSpecList(filter); 

    foreach (var j in xList) 
    { 
    if (xList.Count() == 1) /*Will Not Work since a list could have a single value.*/ 
    { 
     switch(j.FeatureName) 
     {     
     case "ACRating": 
      v.AcRating = j.Value; 
      Console.WriteLine(j); 
      break; 
     } 
    } 
    else 
    { 
     switch(j.FeatureName) 
     { 
     //Am trying to still figure out how to get all the items in BuiltInFeatures, but you get the idea. 
     case "BuiltInFeatures" 
     { 
      v.BuiltInFeatures = "MP3" + "SUNROOF"; 
      break; 
     } 
     } 
    } 
    } 
} 

我面臨的問題是xList.Count不是查看列表值的可靠方法。有沒有一些方法可以將篩選器列表中的項目標記爲列表v/s是單個值。所以當我在代碼中進行比較時,我不必依賴xList.Count。

+0

我不知道是否更容易建立一個字典,而不是一個列表來定義過濾器。 – abhi 2011-03-01 23:44:46

+0

我不確定你想用這段代碼去哪裏?什麼是xList?爲什麼你需要「Count()== 1」檢查? – DaveShaw 2011-03-01 23:44:54

+0

@DaveShaw。 VehicleFilter類返回兩種類型的項目。這些項目在列表中。重複的項目是一個列表。單個項目是屬性。因此,例如,該列表將包含一個或多個標記爲「BuiltInFeatures」的項目。這將作爲一個列表進行處理。如果列表包含單個項目,則會將其分配給屬性。 – abhi 2011-03-01 23:49:41

回答

0

我想我有一個可能的答案。 這是我想到的變化。我回答而不是評論的原因是缺乏評論空間。

我希望我已經正確關閉所有大括號。

var filterList = new Dictionary<string, string> 
           { 
            {"ACRating", "Property"}, 
            {"Axles", "Property"} 
            {"SafetyCodes","List"} 
            {"BuiltInFeatures","List"} 
           }; 

       foreach(KeyValuePair<string,string> i in filterList) 
       { 
        var filter = i.Key; 
        var xList = Vehicles.FilterSpecList(filter); 
        if (i.Value == "List") 
        { 
         foreach (var j in xList) 
         { 
          switch(j.FeatureName) 
          { 
          case "BuiltInFeatures" 
          { 
            v.BuiltInFeatures = "x," + "y"; 
            break; 
          } 
        } 
        else if(i.Value == "Property") 
        { 
       foreach (var j in xList) 
         { 
         switch(j.FeatureName) 
          {     
           case "ACRating": 
            v.AcRating = j.Value; 
            Console.WriteLine(j.ToString()); 
            break; 
          } 
        } 

改進措施表示歡迎。

0

下面是一個示例應用程序,我敲了LinqPad: M是什麼類型您的xList是。如果你需要更多的東西,你可以擴展它。 我敢肯定有比這更流暢的解決方案,但我沒有你的項目的很多知識,這是我能做到的最好... :)

class M 
{ 
    public String FeatureName; 
    public IEnumerable<String> Value; 
} 

M FilterSpecList(String filterName) 
{ 
    if (filterName == "ACRating") 
     return new M {FeatureName = "ACRating", Value = new [] {"OK",}}; 
    else if (filterName == "BuiltInFeatures") 
     return new M {FeatureName = "BuiltInFeatures", Value = new[] {"MP3", "Sunroof",}}; 
    else 
     return new M();//throw new Exception("More.."); 
} 

void Main() 
{ 
    List<String> filterList = new List<String>() 
    { 
     "ACRating", 
     "Axles", 
     "SafetyCodes", 
     "BuiltInFeatures", 
    }; 

    foreach (String filter in filterList) 
    { 
     var xList = FilterSpecList(filter); 

     switch (xList.FeatureName) 
     { 
      case "ACRating": 
       Console.WriteLine(xList.Value.Single()); 
       break; 
      case "BuiltInFeatures": 
       Console.WriteLine(String.Join(" + ", xList.Value)); 
       break; 
      default: 
       break; 
     } 
    } 

} 
+0

感謝您的建議。 – abhi 2011-03-02 00:14:04

0

我仍在試圖弄清楚清單上發生了什麼。然而乍看之下,似乎你可以使用.ToLookUp()'

msdn

的ToLookup(IEnumerable的, Func鍵)方法返回一個 查找,一到多 字典,鍵映射到 值的集合。查找不同於 字典,其中 執行關鍵字 到單個值的一對一映射。

默認的相等比較器默認 用於比較密鑰。