2011-03-01 7 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에 의존 할 필요가 없습니다. 계산.

+0

필터를 정의하는 목록 대신 사전을 작성하는 것이 더 쉬운지 궁금합니다. – abhi

+0

이 코드로 어디로 가고 싶습니까? xList 란 무엇입니까? 왜 "Count() == 1"체크가 필요합니까? – DaveShaw

+0

@DaveShaw. VehicleFilter 클래스에서 반환하는 항목에는 두 가지 유형이 있습니다. 이러한 항목은 목록에 있습니다. 중복 된 항목은 목록입니다. 단일 항목은 속성입니다. 따라서 예를 들어 list에는 "BuiltInFeatures"라는 태그가 추가 된 항목이 하나 이상 포함됩니다. 그러면 목록으로 처리됩니다. 목록에 단일 항목이 포함되어 있으면 속성에 할당됩니다. – abhi

답변

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

0

나는 아직도 목록에서 무슨 일이 일어나는지 알아 내려고하고있다. 그러나 언뜻보기에 당신이 msdn

ToLookup에서 .ToLookUp()'

를 사용할 수 표시 (IEnumerable을, Func을) 방법은 조회, 에 키를 매핑하는 일대 사전을 반환 값의 모음. Lookup은 사전 ( )이 단일 값으로 의 일대일 매핑을 수행하는 것과 다릅니다.

기본 동등 비교 자 기본값 은 키를 비교하는 데 사용됩니다.

관련 문제