2016-05-20 6 views
0
class Program 
{ 
    static void Main(string[] args) 
    { 
     IEnumerable<View> views = new List<View> 
     { 
      new View() {CoordSys = new Plane(){Org=new Origin(){x=1,Vector=0}}, PartNums = new List<int> {1,2,3}} 
      ,new View() {CoordSys = new Plane(){Org=new Origin(){x=2,Vector=0}}, PartNums = new List<int> {4,5,6}} 
      ,new View() {CoordSys = new Plane(){Org=new Origin(){x=3,Vector=0}}, PartNums = new List<int> {13,14,15}} 
      ,new View() {CoordSys = new Plane(){Org=new Origin(){x=2,Vector=0}}, PartNums = new List<int> {7,8,9}} 
      ,new View() {CoordSys = new Plane(){Org=new Origin(){x=2,Vector=0}}, PartNums = new List<int> {10,11,12}} 
      ,new View() {CoordSys = new Plane(){Org=new Origin(){x=1,Vector=0}}, PartNums = new List<int> {16,17,18}} 
     }; 

     IEnumerable<View> viewsByGroup = views.GroupBy(v => v, new ViewComparer()); 

     // loop to process groups 

     Console.ReadLine(); 
    } 
} 

class ViewComparer : IEqualityComparer<View> 
{ 
    public bool Equals(View x, View y) 
    { 
     return x.CoordSys.Org.x == y.CoordSys.Org.x 
      && x.CoordSys.Org.Vector == y.CoordSys.Org.Vector; 
    } 

    public int GetHashCode(View obj) 
    { 
     return obj.CoordSys.GetHashCode(); 
    } 
} 

Как написать сравнение groupBy? Я хочу, чтобы группы, где CoordSys равны. Это моя первая попытка написать пользовательскую группуBy. В этом примере кода есть много возможностей, чтобы сделать его простым. Фактический CoordSys более сложный.написать письмо Linq groupBy

+0

Спасибо за те, кто ответил, к сожалению, мне нужно написать мой компаратор, потому что мое свойство CoordSys намного сложнее, чем int, показанное мной в моем примере. Я попытался упростить проблему, которая могла ввести вас в заблуждение. Мой CoordSys фактически состоит из плоскости, начала координат и вектора, нормального к плоскости. Все это нужно учитывать в моем окончательном решении для сравнения. Спасибо – DustyB

ответ

0

Целью этого было помочь мне понять, как написать пользовательский сопоставитель. Хотя простой GrouBy решил бы мой образец, в конечном решении использовались некоторые вызовы API, которые требовали пользовательского сравнения. Во всяком случае, у меня есть образец, который теперь работает.

class Program 
{ 
    static void Main(string[] args) 
    { 
     IEnumerable<View> views = new List<View> 
     { 
      new View() {CoordSys = new Plane(){Origin=new Origin(){x=1,y=0},Vector=0}, PartNums = new List<int> {1,2,3}} 
      ,new View() {CoordSys = new Plane(){Origin=new Origin(){x=3,y=0},Vector=0}, PartNums = new List<int> {13,14,15}} 
      ,new View() {CoordSys = new Plane(){Origin=new Origin(){x=2,y=0},Vector=0}, PartNums = new List<int> {4,5,6}} 
      ,new View() {CoordSys = new Plane(){Origin=new Origin(){x=1,y=0},Vector=0}, PartNums = new List<int> {16,17,18}} 
      ,new View() {CoordSys = new Plane(){Origin=new Origin(){x=2,y=0},Vector=0}, PartNums = new List<int> {7,8,9}} 
      ,new View() {CoordSys = new Plane(){Origin=new Origin(){x=2,y=0},Vector=0}, PartNums = new List<int> {10,11,12}} 
     }; 

     var viewsByGroup = views.GroupBy(p => p, new ViewComparer()); 

     foreach (var group in viewsByGroup) 
     { 
      foreach (var numList in group.Select(p => p.PartNums)) 
       foreach (int num in numList) 
        Console.Write(num + ", "); 

      Console.WriteLine(); 
     } 

     Console.ReadLine(); 
    } 
} 

class ViewComparer : IEqualityComparer<View> 
{ 
    public bool Equals(View x, View y) 
    { 
     return x.CoordSys.Origin.x == y.CoordSys.Origin.x 
      && x.CoordSys.Vector == y.CoordSys.Vector; 
    } 

    public int GetHashCode(View obj) 
    { 
     return obj.CoordSys.Origin.x.GetHashCode() 
      ^obj.CoordSys.Vector.GetHashCode(); 
    } 
} 
1

попробовать этот

var Group = views.GroupBy(v => v.CoordSys); 
3

Вы можете сгруппировать ваши views как этот

var groups = views.GroupBy(v => v.CoordSys); 

Это дает вам IEnumerable<IGrouping<View>>. Вы можете использовать это, например, так:

foreach(var group in groups) 
{ 
    Console.Write("CoordSys = " + group.Key + " "); 
    Console.Write("Elements: " + group.Count()); 
} 

IGrouping является essentialy IEnumerable из View с в группе плюс Key свойство, представляющее значение, сгруппированные по (CoordSys в вашем случае).

+0

Точно, где я возглавляюсь, кроме моего CoorSys в образце, слишком просто и в результате вводит в заблуждение. – DustyB