two multiple fields columns c# .net linq group-by

c# - multiple - linq group by count



Datos grupales con claves y valores Ășnicos (2)

Esto podría funcionar para ti

public static List<Numbers> setNumbers() { List<Numbers> num = new List<Numbers>(); num.Add(new Numbers() { Column1 = 1, Column2 = 137 }); num.Add(new Numbers() { Column1 = 1, Column2 = 143 }); num.Add(new Numbers() { Column1 = 11, Column2 = 37 }); num.Add(new Numbers() { Column1 = 11, Column2 = 46 }); num.Add(new Numbers() { Column1 = 11, Column2 = 132 }); num.Add(new Numbers() { Column1 = 46, Column2 = 65 }); num.Add(new Numbers() { Column1 = 46, Column2 = 139 }); num.Add(new Numbers() { Column1 = 69, Column2 = 90 }); return num; } public static void group() { List<Numbers> numbers = setNumbers(); var grouppedNumbers = numbers .GroupBy(x => x.Column1).ToList(); grouppedNumbers.AddRange(grouppedNumbers.FirstOrDefault(x => x.First().Column1.Equals(46)).Select(s => new Numbers() { Column1 = 11, Column2 = s.Column2 }).GroupBy(g => g.Column1).ToList()); grouppedNumbers.Remove(grouppedNumbers.FirstOrDefault(x => x.First().Column1.Equals(46))); foreach (var groups in grouppedNumbers) { Console.WriteLine(groups.First().Column1); foreach(var i in groups) { Console.WriteLine(i.Column1+" "+ i.Column2); } } }

Tengo un siguiente conjunto de números:

1 137 1 143 11 37 11 46 11 132 46 65 46 139 69 90

Ahora, necesito agrupar los datos por el primer valor de una manera que ninguna clave de grupo esté presente en los valores del grupo. Entonces, por ejemplo, si tuviera que simplemente agrupar datos, obtendría este resultado:

1 137 143 11 37 46 132 46 65 139 69 90

46 aquí hay una clave de grupo en el tercer grupo y un valor de grupo en el segundo grupo. En este caso, necesito fusionar los valores del grupo del tercer grupo en un segundo grupo y eliminar el tercer grupo. El resultado final de la agrupación debería verse así:

1 137 143 11 37 46 132 65 139 69 90

Soy relativamente nuevo en C #, así que me preguntaba si hay una forma elegante de hacerlo con LINQ.


Pruebe esta solución LINQ:

var numbers = new List<Number> { new Number {X = 1, Y = 137}, new Number {X = 1, Y = 143}, new Number {X = 11, Y = 37}, new Number {X = 11, Y = 46}, new Number {X = 11, Y = 132}, new Number {X = 46, Y = 65}, new Number {X = 46, Y = 139}, new Number {X = 69, Y = 90} }; var result = numbers.GroupBy(c => c.X); var result2 = numbers.FirstOrDefault(c => result.Select(d => d.Key).Contains(c.Y)); var finalResult = numbers.Where(x => x.X == result2?.Y) .Select(x => { x.X = result2.X;x.Y = x.Y; return x; } ) .Union(numbers.Where(c => c.X != result2?.Y)).GroupBy(c => c.X , (key, element) => new { Key = key, Element = element.Select(c => c.Y).ToList() });

El resultado: