2013-12-11 2 views
-1

여러 목록을 병합하고 반환하려면이 코드를 온라인에서 검색했습니다. 이 코드는 모든 속성이 문자열 인 경우 작동하지만 일부 속성이 double 인 경우 오류가 발생합니다. 이 오류는 "Operator '??'입니다. 'double'및 'double' "유형의 피연산자에는 적용 할 수 없습니다. 어떤 도움이라도 대단히 감사합니다. 고마워요C# 이중 속성을 가진 목록 병합

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication11 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      List<Project> lst1; List<Project> lst2; List<Project> lst3; 
      lst1 = new List<Project> 
      { 
       new Project { ProjectId = 1, ProjectName = "P1" }, 
       new Project { ProjectId = 2, ProjectName = "P2" }, 
       new Project { ProjectId = 3, ProjectName = "P3" } 
      }; 
        lst2 = new List<Project> 
      { 
       new Project { ProjectId = 1, CustomerNum = 1}, 
       new Project { ProjectId = 2, CustomerNum = 2}, 
       new Project { ProjectId = 3, CustomerNum = 3} 
      }; 
        lst3 = new List<Project> 
      { 
       new Project { ProjectId = 1, Address = 10}, 
       new Project { ProjectId = 2, Address = 20}, 
       new Project { ProjectId = 3, Address = 30} 
      }; 

        List<Project> lst = lst1.Union(lst2).Union(lst3).ToLookup(x => x.ProjectId).Select(x => new Project() 
        { 
         ProjectId = x.Key, 
         ProjectName = x.Select(y => y.ProjectName).Aggregate((z1, z2) => z1 ?? z2), 
         CustomerNum = x.Select(y => y.CustomerNum).Aggregate((z1, z2) => z1 ?? z2), 
         Address = x.Select(y => y.Address).Aggregate((z1, z2) => z1 ?? z2) 
        }).ToList(); 


      foreach (var item in lst) 
      { 
       Console.WriteLine("{0}, {1}, {2}, {3}", item.ProjectId, item.ProjectName, item.CustomerNum, item.Address); 

      }  
     } 
    } 

    public class Project 
    { 
     public int ProjectId { get; set; } 
     public string ProjectName { get; set; } 
     public double CustomerNum { get; set; } 
     public double Address { get; set; } 
    } 
} 

답변

0

?? "왼쪽면이 null이면 오른쪽에있는 값을 사용하십시오"라고 말합니다. Double은 값 유형이므로 절대 null이 될 수 없습니다. 그래서 당신은 항상 단지 재산의 왼쪽을 얻을 것이다. 컴파일러는 코드가 의심 스럽다고 말합니다.

Double? 정확한 코드를 유지하고 싶다면

+0

?? 두 배로? 그리고 몇 가지 오류가 발생했습니다 – user3072518

+0

아니, 나는 대체하지 말고 ??. 문제는 유형입니다. 두배 ?? double은 null 가능하지 않기 때문에 double은 유효하지 않습니다. 하지만 두 배? ?? 더블? 더블이 유효하기 때문에 유효합니까? Nullable Double입니다. 다른 유형입니다. –

+0

입력 해 주셔서 감사합니다. 코드를 어떻게 변경 하시겠습니까? – user3072518

1

널 유착은 this MSDN article

로부터 좌측

에 비 - 널 타입 (double)에 대해 작동하지 않는다 ?? 운영자는 널 병합 연산자라고하며

그래서 널 (NULL) 값 형식 또는 참조 유형에 대한 기본 값을 정의하는 데 사용됩니다, 당신은 double? (Nullable<double>)를 사용할 수 있으며이 작동합니다. 그러나, 작성된대로 왼쪽에는 항상 가치가 있으므로 문제가됩니다. Alternatively, you could check if the type is a value type?

+0

임의의 downvoter, 만약 당신이 downvote 여전히 주위에 설명 할 수 있습니까? –

1

당신은 당신의 코드는 다른 종류의 일을하고 같은 일을하려는 경우, 당신이 할 수있는 다음과 같은 I 작동하는 간단한 (긴) 솔루션을 함께했다

CustomerNum = x.Select(y => y.CustomerNum).Aggregate((z1, z2) => z1) 
+0

z1은 double이므로 절대 null이 아닙니다. 너는 그것도 null과 비교할 수 있는지 잘 모르겠다. –

+0

이것은 '??'연산자의 긴 버전 일 뿐이며 기능적으로 아무 것도 변경하지 않습니다. 또한 문제를 해결하지 못합니다. –

+0

@BillGregg 'z1'과'z2'는 여러 유형이 될 수 있다는 인상을 받았습니다. 일부는 null 가능합니다. –

0

. 병합 된 목록의 코드는 다음과 같습니다.

 List<Project> lst = new List<Project>(); 

     for (int i = 0; i < lst1.Count; i++) 
     { 
      double cusnum = 0; 
      var lst2q = (from s in lst2 
          where s.ProjectId == lst1[i].ProjectId 
          select s).ToArray(); 

      if (lst2q.Length > 0) 
      { 
       cusnum = lst2q[0].CustomerNum; 
      } 


      var lst3q = (from s in lst3 
         where s.ProjectId == lst1[i].ProjectId 
         select s).ToArray(); 

      double cusadd = 0; 
      if (lst3q.Length > 0) 
      { 
       cusadd = lst3q[0].Address; 
      } 

      lst.Add(new Project 
       { 
        ProjectId = lst1[i].ProjectId, 
        ProjectName = lst1[i].ProjectName, 
        CustomerNum = cusnum, 
        Address = cusadd, 
       }); 
     }