2017-05-19 8 views
0

私は辞書でグループを行う必要があり、キー、値を持つ別の辞書にグループに基づいて結果の行を取得する必要がありますペア、値はリスト(位置)です。私はリスト(ポジション)として値1、値と値オブジェクトを持つキーオブジェクトを持つ別の辞書を持っているしたいと思う結果でgroup by辞書でクラスキー、値オブジェクトlinqを使用

public class Positions 
{ 
    public string Value1 { get; set; } 
    public int Value2 { get; set; } 
    public string Value3 { get; set; } 
    public string Value4 { get; set; } 
    public string Value5 { get; set; } 
    public string Value6 { get; set; } 
    public string Value7 { get; set; } 
    public string Value8 { get; set; } 
    public string Value9 { get; set; } 
    public string Value10 { get; set; } 
    public string Value11 { get; set; } 
    public string Value12 { get; set; } 
} 

public struct PositionKey 
{ 
    public string Value1 { get; set; } 
    public int Value2 { get; set; } 
    public string Value3 { get; set; } 
    public string Value4 { get; set; } 
    public string Value5 { get; set; } 
    public string Value6 { get; set; } 

    public override int GetHashCode() 
    { 
     return (Value1 != null ? Value1.GetHashCode() : 1) 
      ^(Value2 > 0 ? Value2.GetHashCode() : 1) 
      ^(Value3 != null ? Value3.GetHashCode() : 1) 
      ^(Value4 != null ? Value4.GetHashCode() : 1) 
      ^(Value5 != null ? Value5.GetHashCode() : 1) 
      ^(Value6 != null ? Value6.GetHashCode() : 1); 
    } 

    public override bool Equals(object obj) 
    { 
     PositionKey compositeKey = (PositionKey)obj; 
     return Value1 == compositeKey.Value1 
       && Value2 == compositeKey.Value2 
       && Value3 == compositeKey.Value3 
       && Value4 == compositeKey.Value4 
       && Value5 == compositeKey.Value5 
       && Value6 == compositeKey.Value6; 
    } 
} 


public struct GroupbyPositionKey 
{ 
    public string Value1 { get; set; } 
    public int Value2 { get; set; } 
    public override int GetHashCode() 
    { 
     return (Value1 != null ? Value1.GetHashCode() : 1) 
      ^(Value2 > 0 ? Value2.GetHashCode() : 1); 
    } 

    public override bool Equals(object obj) 
    { 
     PositionKey compositeKey = (PositionKey)obj; 
     return Value1 == compositeKey.Value1 
       && Value2 == compositeKey.Value2; 
    } 
} 

public class program 
{ 
    /*   
     Value1 Value2 Value3 Value4 Value5 Value6 Value7 Value8 Value9 Value10 Value11 Value12 
     ------------------------------------------------------------------------------------------------- 
     v1  1  val1 val2 val3 val4 val5 val6 val7 val8  val9  val10 
     v1  1  val2 val3 val4 val5 val6 val7 val8 val9  val10  val11 
     v3  4  val3 val4 val5 val6 val7 val8 val9 val10 val11  val12 
     v3  4  val4 val5 val6 val7 val8 val9 val10 val11 val12  val13 
     v3  5  val5 val6 val7 val8 val9 val10 val11 val12 val13  val14 
     v4  6  val6 val7 val8 val9 val10 val11 val12 val13 val14  val15 
     v4  6  val7 val8 val9 val10 val11 val12 val13 val14 val15  val16 
     v4  7  val8 val9 val10 val11 val12 val13 val14 val15 val16  val17 
     v4  7  val9 val10 val11 val12 val13 val14 val15 val16 val17  val18 


     Group by - Value1 Value2 Value3 Value4 Value5 Value6 Value7 Value8 Value9 Value10 Value11 Value12 
     Get List of the rows after the grouping on the basis of group by Value1,Value2 
    */ 
    public static void main() 
    { 
     Dictionary<PositionKey, Positions> dictPositons = new Dictionary<PositionKey, Positions>(); 

     Positions obj = new Positions(); 
     obj.Value1 = "v1"; 
     obj.Value2 = 1; 
     obj.Value3 = "val1"; 
     obj.Value4 = "val2"; 
     obj.Value5 = "val3"; 
     obj.Value6 = "val4"; 
     obj.Value7 = "val5"; 
     // ........ and so on.. and so forth...for all the objects. 

     /* 
      I have a datatable as above and i am inserting the rows in the collection object of class <Positions> with respective key 
      and add the same to the dictionary. 
     */ 

     PositionKey key = new PositionKey(); 
     key.Value1 = "v1"; 
     key.Value2 = 1; 
     key.Value3 = "val3"; 
     key.Value4 = "val4"; 
     key.Value5 = "val5"; 
     key.Value6 = "val6"; 

     if (!dictPositons.ContainsKey(key)) 
     { 
      dictPositons.Add(key, obj); // this dictionary would have the raw data which would have all the rows from the table as a dictionary collection 
     } 


     /* 
     Now I have to create another dictionary which gives me a list of all the records by grouping on the basis 
     of the key <GroupbyPositionKey> which is nothing but <Value1,Value2> 

     The resulting dictionary should look like Dictionary<GroupbyPositionKey,List<Positions>> 
     */ 
     Dictionary<GroupbyPositionKey, List<Positions>> result = new Dictionary<GroupbyPositionKey, List<Positions>>(); 
     result = dictPositions.GroupBy(....); // not sure how ? 
    } 
} 

は、ここに私の問題文を説明し、以下のコードスニペットです。私は希望の結果を得るために辞書でグループに近づく方法をよく分かりません。

私はすでに辞書を手作業でループし、新しいキーに基づいて他の辞書を選択して挿入することで、この結果を達成しました。しかし、これを行うLINQの方法があるかどうかを知りたかったので、はるかに短くなります。

答えて

0

あなたGroupBy声明の中で、あなたはそれを指摘して私の悪い、おかげで新しいGroupbyPositionKeyクラスを作成し、あなたの鍵とリスト

Dictionary<GroupbyPositionKey, List<Positions>> result = dictPositons 
     .GroupBy(x => new GroupbyPositionKey { Value1 = x.Key.Value1, Value2 = x.Key.Value2 }) 
     .ToDictionary(x => x.Key, x => x.Select(y => y.Value).ToList()); 
+0

を選択するために、ToDictionaryメソッドを使用する必要があります。しかし、私はより大きな鍵のセット、すなわち全てのレコードを一意的に識別し、辞書に挿入することによって最初の辞書を塗りつぶすを持っています。その後、私は2つのキーのセットだけでグループを適用したい。また、私はすでに手作業でこれを達成しています。だから私はLINQの方法が必要でした。 –

+0

解決したい問題をより正確に示すために質問を更新できますか? – TomDoesCode

+0

はい、質問を更新しました。更新が必要な場合は教えてください。 –