Autor Beitrag
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Sa 09.07.11 09:25 
Hallo Zusammen,

ich möchte nicht nur nach SpalteA gruppieren, sondern auch nach SpalteB. Die Spalten enthalten Vornamen bzw. Nachnamen.
Es soll jede Person gruppiert werden. Im Ergebnis müssen beide Spalten enthalten sein. Daher hilft mir eine Verknüpfung der beiden Spalten vermutlich nicht. In der Abfragesyntax funktioniert das relativ einfach mit "Group x by new...". Hier kann man zwei Gruppierungsspalten aufnehmen.

Wie aber funktioniert das in der Extension_Method Syntax?

Hier ist meine vorbereitete Query über eine Spalte. Hier müsste jetzt die zweite SpalteB ergänzt werden.
Noch zur Info:
Der StringComparer sollte auch funktionieren. Es sollen gleiche Namen mit unterschiedlicher Groß-Kleinschreibung als eine Gruppe behandelt werden. Bei einer Spalte funktioniert´s.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
DataTable dt = new DataTable();
            dt.Columns.Add("SpalteA");
            dt.Columns.Add("SpalteB");
            dt.Columns.Add("SpalteC");

            DataRow row1 = dt.NewRow();
            row1["SpalteA"] = "Frank";
            row1["SpalteB"] = "Mustermann";
            row1["SpalteC"] = "12,50";

            DataRow row2 = dt.NewRow();
            row2["SpalteA"] = "frank";
            row2["SpalteB"] = "Mustermann";
            row2["SpalteC"] = "100,00";

            DataRow row3 = dt.NewRow();
            row3["SpalteA"] = "klaus";
            row3["SpalteB"] = "Mustermann";
            row3["SpalteC"] = "500,00";

            DataRow row4 = dt.NewRow();
            row4["SpalteA"] = "Frank";
            row4["SpalteB"] = "Schmidt";
            row4["SpalteC"] = "1500,00";

            dt.Rows.Add(row1);
            dt.Rows.Add(row2);
            dt.Rows.Add(row3);
            dt.Rows.Add(row4);

var query=dt.AsEnumerable()
                .GroupBy(x=>x.Field<string>("SpalteA"),StringComparer.InvariantCultureIgnoreCase)
                
                .Select(grp=>new
                {
                    Name=grp.Key
                });

foreach (var item in query)
            {
                
            }


Gruß

Frank
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 09.07.11 11:14 
Hallo Frank,

du mußt einen eigenen IEqualityComparer schreiben (anstatt direkt StringComparer.InvariantCultureIgnoreCase zu benutzen):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
struct AB : IEqualityComparer<AB>
{
  public string A, B;

  #region IEqualityComparer<AB> Members

  public bool Equals(AB x, AB y)
  {
    return StringComparer.InvariantCultureIgnoreCase.Equals(x.A, y.A) &&
        StringComparer.InvariantCultureIgnoreCase.Equals(x.B, y.B);
  }

  public int GetHashCode(AB obj)
  {
    if (Object.ReferenceEquals(obj, null)) return 0;

    int HashCode = StringComparer.InvariantCultureIgnoreCase.GetHashCode(obj.A) ^
                     StringComparer.InvariantCultureIgnoreCase.GetHashCode(obj.B);

    return HashCode;
  }

  #endregion
}

Und dann kannst du diese Klasse zum Gruppieren benutzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
var query = dt.AsEnumerable()
    .GroupBy(x => new AB() { A = x.Field<string>("SpalteA"), B = x.Field<string>("SpalteB") }, new AB())
    .Select(grp => new
    {
      Vorname = grp.Key.A,
      Name = grp.Key.B
    });

(hat mich aber auch etwas Zeit gekostet das rauszufinden ;-)

P.S: Ich habe hier im Beispiel die gleiche Klasse AB als Datenklasse als auch als IEqualityComparer-Klasse benutzt (besser wäre jedoch die Trennung in 2 Klassen)

Für diesen Beitrag haben gedankt: Oppi35