2011-08-10 5 views
0

이 질문은 C#, LINQ 그룹화 및 컬렉션과 관련이 있습니다.어떤 C# 데이터 구조를 사용해야합니까?

현재 그룹화 문제에 대해 작업 중이며 커뮤니티의 의견을 받고 싶습니다. 과거에이 특정 문제가 발생하여 충분한 시간을 가지기 때문에 자신의 데이터 구조를 작성하려고합니다. 세부 사항은 다음과 같습니다.

제조업체와 제품으로 구성되며 데이터 구조가 제조업체별로 그룹화되어 있다고 가정합니다. 많은 제조업체와 많은 제품이 있습니다. 제조업체마다 고유 한 이름과 ID가 있습니다. 제품의 이름은 비슷하지만 고유 ID가 있습니다. 진행 목록은 예제를 나타냅니다.

포드 1 축제 1945 토러스 6413 퓨전 4716, F1 8749,

도요타 2 캄리 1311 프리우스 6415 화관 1117 코마 9471

시보레 3 실버라도 4746, Camero 6473, 볼트 3334, 타호 등 9974

은 ...

내가 표현하기 위해 사용하는 것이 데이터 구조이 될 것

IEnumerable<Manufacturer, ManufacturerID, IEnumerable<Product, ProductID>> 
,

하지만 이것은 존재하지 않습니다. 따라서 커뮤니티에 데이터 구조를 권하고 싶습니다. 왜 그런지 물어보고 싶은 제 질문은 무엇입니까?

업데이트 :

나는 익명의 유형을 유지하고 동적 키워드를 피하기 위해 싶습니다. 그래서 데이터 구조가

IEnumerable SomeDataStructure<T, U, V>

같은 것을 할 것입니다 다른 요구 사항은 그 항목을 복제 한 수입니다. 여기에 내가 생각하고 무슨 종류의 :

public class MyDataStructure<T, U, V> 
{ 
    // make this like a list, not a dictionary 
} 

업데이트 :

가 나는 튜플 데이터 구조와 함께 이동하기로 결정했다. 매우 강력하고 쉽게 쿼리 할 수 ​​있습니다. 절차 코드는 제조사 - 차량 관계를 생성하는 방법을 사용하는 방법입니다. 그 결과 고유의 제조업체가 이름별로 주문 된 관련 고유 차량으로 이름순으로 주문한 멋지게 주문 된 데이터 구조가됩니다.

public class ManufacturersVehicles 
{ 
    public int ManufacturerID { get; set; } 
    public string ManufacturerName { get; set; } 
    public int VehicleID { get; set; } 
    public string VehicleName { get; set; } 
} 

// "data" actually comes from the database. I'm just creating a list to use a mock structure to query against. 
var data = new List<ManufacturersVehicles> 
{ 
    { ManufacturerID = 1, Manufacturer = "Ford", VehicleID = 1945, VehicleName = "Fiesta" }, 
    { ManufacturerID = 1, Manufacturer = "Ford", VehicleID = 6413, VehicleName = "Taurus" }, 
    { ManufacturerID = 1, Manufacturer = "Ford", VehicleID = 4716, VehicleName = "Fusion" }, 
    etc... 
}; 

// Get a collection of unique manufacturers from the data collection and order it by the manufacturer's name. 
var manufacturers = data.Select(x => new { ManufacturerID = x.ManufacturerID, ManufacturerName = x.ManufacturerName }) 
         .Distinct() 
         .OrderBy(x => x.ManufacturerName) 
         .Select(x => Tuple.Create(x.ManufacturerID, x.ManufacturerName, new Dictionary<int, string>())) 
         .ToList(); 

// Add the manufacturer's vehicles to it's associated dictionary collection ordered by vehicle name. 
foreach (var manufacturer in manufacturers) 
{ 
    // Get the collection of unique vehicles ordered by name. 
    var vehicles = _alertDetails.Where(x => x.ManufacturerID == manufacturer.Item1) 
           .Select(x => new { VehicleID = x.VehicleID, VehicleName = x.VehicleName }) 
           .Distinct() 
           .OrderBy(x => x.VehicleName); 

    foreach (var vehicle in vehicles) 
    { 
     manufacturer.Item3.Add(vehicle.VehicleID, vehicle.VehicleName); 
    } 
} 
+1

왜 다시 필요합니까? 왜 익명 유형을 사용하지 않는가? –

+1

데이터는 어떻게 처리됩니까? 제조업체별로 제품 목록을 검색해야합니까? 또는 제품 제조업체를 찾으십니까? 또는 무엇을? – SirPentor

+0

데이터를 사용하여 asp.net에서 treeview 컨트롤을 채 웁니다. 데이터베이스의 데이터는 그룹화없이 되돌아옵니다. 이벤트가 데이터를 필터링 할 때 쉽게 액세스 할 수 있도록 데이터 구조를 쉽게 그룹화하고 싶습니다. – Halcyon

답변

2

MyDataStructureTuple과 매우 유사합니다. 제네릭 매개 변수 변형에 대해서는 here을 참조하십시오. Tuple은 여러 가지 다른 유형에 대해 강력한 형식의 컨테이너를 제공합니다.

+0

나는 이것을 가지고 놀 것입니다. 여기에 내가 무엇을 가지고 : var tuple = new List >>(); – Halcyon

+0

이것은 정확히 내가 찾던 것이 었습니다. 내가 사용한 방법을 보려면 마지막 편집을 참조하십시오. 많은 감사합니다! – Halcyon

3

이렇게하면?

public class Manufacturer : IEquatable<Manufacturer> 
{ 
    public string Name { get; private set; } 
    public int ID { get; private set; } 
    // ... 
} 

public class Product 
{ 
    public string Name { get; private set; } 
    public int ID { get; private set; } 
    // ... 
} 

// groups is of type IEnumerable<IGrouping<Manufacturer, Product>> 

var groups = data.GroupBy(row => new Manufacturer(row), row => new Product(row)); 

편집 : 당신은 (당신이 당신의 업데이트에 지금 언급 한 바와 같이) 대신 내 샘플로 ManufacturerProduct 클래스 선언의 익명 객체를 생성하는 경우 다음 GroupBy 그냥 잘 작동한다 익명 형식을 사용하려면 .

+0

Manufacturer와 Product간에 아무런 관계도 보이지 않으며 Linq 쿼리에서 "data"요소를 매개 변수로 사용하는 생성자가 없습니다. 이것이 대체물로 작용할 수있는 방법을 모르겠습니다. –

+0

결과 그룹에 관계가 암시 적으로 표시됩니다. 생성자는 사소한 것이어야하지만 데이터가 소싱되는 방법에 따라 다릅니다. 포스터는 그에 대한 자세한 내용은 밝히지 않았지만 어쩌면 하나의 데이텀에 포함 된 제조업체 및 제품 정보와 함께 조인 된 데이터의 큰 테이블에서 나온 것이라고 가정했습니다. 이 경우 제조업체와 제품을 연결하는 것이 가장 직접적인 방법입니다. – mquander

6

나는라는 클래스 제조 업체를 만들 것입니다 :

public class Manufacturer 
{ 
    public int ManufacturerId { get; set;} 
    public string Name { get; set; } 
    public IEnumerable<Product> Products { get; set;} 
} 

그런 다음 제품 클래스를 만들 :
public class Product 
{ 
    public int ProductId { get; set;} 
    public string Name { get; set;} 
} 

그런 다음 제조업체 객체를 생성하기 위해 확장 선택 방법 LINQ 투영을 사용합니다.

+0

"LINQ grouping and Collections *"에 대한 질문이 "Manufacturer"와 "Product"모델링보다 많은 것으로 보입니다. 이 질문에서 볼 수 있듯이, 그는 이미'Manufacturer'와'Product'에 대한 객체 모델을 가지고 있습니다. – ckittel

+0

나는 그것을 얻는다. 그러나 매우 특별한 시나리오를 위해 그 모든 문제를 해결해야하는 이유는 무엇인가. 모델을 올바르게 모델링 한 경우 LINQ to Objects를 사용하여 원하는 방식으로 데이터 서식을 지정할 수 있습니다 (위의 John Saunders 질문과 유사). – Josh

+0

정확히 그는 이미 생성 된'Manufacturer' 클래스와'Product' 클래스를 사용하여 LINQ to Objects를 사용하여 결과를 형성하는 방법을 묻습니다. 당신은 대답을 단순히 그의 질문을 어떤 방식 으로든 다시 말하고있는 것입니다. – ckittel

관련 문제