2017-02-28 4 views
0

特定のカテゴリでテーブルをグループ化したい。Linqクエリの特定の結果を組み合わせる

カテゴリは次のようになります。"AAA", "BBB", "CCC", "DDD", "EEE", etc...以下のコードを使用して、各グループの結果を簡単に取得できます。ただし、2つのカテゴリを結合し、新しいKeyが生成される特別なケースがあります(たとえば、Category BBBとDDDは1つのカテゴリになります)。 キー: "AAA"、アイテム:(AAAの下の項目) キー: "BBB/DDD"、アイテム:(BBBとDDD下の項目) キー: "CCC"

私の最終的な結果は次のようになります、アイテム:(CCCの下のアイテム)

これはしばらくの間行ってきましたが、何もできません。基本的に、あなたがする必要があるすべては、それによってグループ化する前にキーを変換することです

var query= ds.Tables[0].AsEnumerable() 
      .GroupBy(g => g.Field<string>("category")) 
      .Select(a => new workType 
      { 
       Key = a.Key, 
       Item = a.ToList() 
      }); 

public class workType 
{ 
    public string Key { get; set; } 
    public List<DataRow> Item { get; set; } 
} 
+0

いくつかのパラメータがないと、これがどのように可能かわかりません。あなたは「AAA」、「BBB」などと言っている「キー」を選択しています。 'Key = a.Key ||のような他の機能を提供する必要があります。 b.key'。私はこれを解決するための一般的な方法はありません。 – jdmdevdotnet

答えて

1

var sequence = ds.Tables[0].AsEnumerable(); 

var result = sequence 
     .Select(e => new { Key = GetCompoundKey(e.Field<string>("category")), Value = e }) 
     .GroupBy(e => e.Key) 
     .Select(g => new { Key = g.Key, Items = g.SelectMany(e => e.Value).ToList() }); 


private static string GetCompoundKey(string originalKey) 
{ 
    if (originalKey.Equals("BBB") || originalKey.Equals("DDD")) 
    { 
     return "BBB/DDD"; 
    } 

    return originalKey; 
} 

そのほかに、GroupByはそうあなたがIEqualityComparer<string>実装と使用を書くことができIEqualityComparer<T>を受け取るオーバーロードがありますそれ:

private class KeysEqualityComparer : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     if (x.Equals(y)) 
     { 
      return true; 
     } 

     return (x.Equals("BBB") && y.Equals("DDD")) 
      || (x.Equals("DDD") && y.Equals("BBB")); 
    } 

    public int GetHashCode(string str) 
    { 
     return str.GetHashCode(); 
    } 
} 

// your original code using the comparer: 
var query= ds.Tables[0].AsEnumerable() 
      .GroupBy(g => g.Field<string>("category"), new KeysEqualityComparer()) 
      .Select(a => new workType 
      { 
       Key = a.Key, 
       Item = a.ToList() 
      }); 

これは良いアイデアかどうかは分かりませんが、おそらく奇妙なグループキーとにかく変更する必要があります。そして、ロジックが同じでなければならないにもかかわらず、変更コードは比較コードとは異なる場所に存在します。それは将来的にいくつかの問題を求めています。

+0

あなたのアプローチの問題は、 'BBB'または' DDD'カテゴリのみが存在する状況でも、複合キー 'BBB/DDD'を作成することです。これは、OPが望むものであってもなくてもよい。 – dasblinkenlight

+0

あなたの最初の解決策は、私が必要としていたものとまったく同じです。ありがとう。 – SharpBarb

+0

@dasblinkenlight好奇心の邪魔をして、実際にスーパーセットで何かをグループ化してから、その要素がどのサブセットに由来するのか興味があるのは、実際には適切なケースですか?なぜあなたはスーパーセットでグループ化するのですか? –

関連する問題