17

とにかく、これに似たようなことを行うLINQ2SQLクエリを実行する方法はありますか:

var result = source.GroupBy(a => new { a.Column1, a.Column2 });

また

var result = from s in source
             group s by new { s.Column1, s.Column2 } into c
             select new { Column1 = c.Key.Column1, Column2 = c.Key.Column2 };

しかし、グループ化された列の内容の大文字と小文字を無視して?

4

4 に答える 4

7

NaveenBhat のソリューションを機能させることができず、コンパイル エラーが発生しました。

メソッド 'System.Linq.Enumerable.GroupBy(System.Collections.Generic.IEnumerable, System.Func, System.Collections.Generic.IEqualityComparer)' の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

これを機能させるには、キー列 (GroupKey) を格納する新しいクラスを定義してから、IEqualityComparer (KeyComparer) を実装する別のクラスを定義するのが最も簡単で明確であることがわかりました。その後、私は呼び出すことができます

var result= source.GroupBy(r => new GroupKey(r), new KeyComparer());

KeyComparer クラスは文字列を InvariantCultureIgnoreCase 比較子と比較します。そのため、正しい方向に向けてくれた NaveenBhat に感謝します。

私のクラスの簡略化されたバージョン:

private class GroupKey
{
    public string Column1{ get; set; }
    public string Column2{ get; set; }

    public GroupKey(SourceObject r) {
        this.Column1 = r.Column1;
        this.Column2 = r.Column2;
    }
}

private class KeyComparer: IEqualityComparer<GroupKey>
{

    bool IEqualityComparer<GroupKey>.Equals(GroupKey x, GroupKey y)
    {
        if (!x.Column1.Equals(y.Column1,StringComparer.InvariantCultureIgnoreCase) return false;
        if (!x.Column2.Equals(y.Column2,StringComparer.InvariantCultureIgnoreCase) return false;
        return true;
        //my actual code is more complex than this, more columns to compare
        //and handles null strings, but you get the idea.
    }

    int IEqualityComparer<GroupKey>.GetHashCode(GroupKey obj)
    {
        return 0.GetHashCode() ; // forces calling Equals
        //Note, it would be more efficient to do something like
        //string hcode = Column1.ToLower() + Column2.ToLower();
        //return hcode.GetHashCode();
        //but my object is more complex than this simplified example

    }
}
于 2014-09-05T22:19:23.587 に答える
1

テーブルの DataRow オブジェクトの値でグループ化するという同じ問題がありましたが、DataRow オブジェクトで .ToString() を使用して、コンパイラの問題を回避しました。

MyTable.AsEnumerable().GroupBy(
    dataRow => dataRow["Value"].ToString(),
    StringComparer.InvariantCultureIgnoreCase)

それ以外の

MyTable.AsEnumerable().GroupBy(
    dataRow => dataRow["Value"],
    StringComparer.InvariantCultureIgnoreCase)
于 2015-07-31T10:09:30.943 に答える