C# DataTable Linq group részhalmazra is?
Olyan oszlop sorait is összevonja, ahol az egyik sor szöveg tartalma a másik részhalmaza.
Van egy ilyen táblám:
DataTable dt = new DataTable();
dt.Columns.Add("felev", typeof(System.String));
dt.Columns.Add("nap", typeof(System.String));
dt.Rows.Add("1,2,3", "hétfő");
dt.Rows.Add("1,2,3,4,5", "hétfő");
dt.Rows.Add("1,2,3,4,5", "hétfő");
dt.Rows.Add("6,7,8,9,10", "hétfő");
dt.Rows.Add("1,2,3", "kedd");
dt.Rows.Add("1,2,3,4,5", "kedd");
dt.Rows.Add("1,2,3", "szerda");
dt.Rows.Add("1,2,3", "vasárnap");
És egy megoldásom rá:
var q = from akt in dt.AsEnumerable()
group akt by new
{
felev = akt.Field<string>("felev"),
nap = akt.Field<string>("nap")
}
into g
select new
{
felev = g.Key.felev,
nap = g.Key.nap
};
Ez csak olyan félévre és napra húz össze, ahol a sorok pontosan egyeznek (összevonja a 2,3 sorokat).
Nekem olyan kimenet kellene, amely összehúzza a tábla 1,2,3 és 5,6 sorát, úgy hogy a hosszabbik szöveget tartalmazó maradjon meg.
Ilyen kimenetre lenne szükségem:
"1,2,3,4,5", "hétfő"
"6,7,8,9,10", "hétfő"
"1,2,3,4,5", "kedd"
"1,2,3", "szerda"
"1,2,3", "vasárnap"
Tudnátok olyan kóddal kiegészíteni a fentieket, amivel a megfelelő kimenet kapható?
Előre is köszönöm a segítségetek!
Készítettem egy fapados verziót, ami a fentiek eredményéből dolgozik.
Jobb lenne, ha már a group-olás közben meg lehetne oldani.
int i = 0;
List<int> rowIndexes = new List<int>();
DataTable dtOutput = dt.Clone();
while (i < q.Count())
{
--if (!rowIndexes.Contains(i))
--{
----var q2 = from akt in q
------where q.ToList()[i].nap == akt.nap
------&& (q.ToList()[i].felev.Contains(akt.felev)
------|| akt.felev.Contains(q.ToList()[i].felev)) select akt;
----List<int> indexOfRows = q2.Select(x => q.ToList().IndexOf(x)).ToList();
----rowIndexes.AddRange(indexOfRows);
----var q3Row = q2.OrderByDescending(x => x.felev.Length).First();
----dtOutput.Rows.Add(q3Row.felev, q3Row.nap);
--}
--i++;
}
Az előző hozzászólásomban lévő kódban, megkeresi a program a fenti q group-olt eredményből azokat a sorokat, amelyeknél megegyezik a "nap" és a "felev"-nél a részhalmazhoz köthetőek. Ezeket kigyűjti egy újabb táblába.
Szeretném ezt egyszerűbbre venni, mert kb írtam egy group metódust a megoldásomban.
Ezek a számok mit jelentenek?
Mit kéne csinálni a
"1,2,3,4", "hétfő"
"1,2,3,5", "hétfő"
esetben?
Vagy a
"1,2,3", "hétfő"
"1,2,30", "hétfő"
esetben?
#4 Ez két szöveg formátumú oszlopa annak az adattáblának amit a programom inputként kap.
#5 Az "1,2,3" "hétfő", "1,2,3,4,5" "hétfő" és "1,2,3,4,5" "hétfő" sorokat össze kellene vonnia ezzé: "1,2,3,4,5" "hétfő".
Ugyanígy az "1,2,3" "kedd" és "1,2,3,4,5" "kedd" sorokat is ezzé: "1,2,3,4,5" "kedd".
A kérdésemre nem válaszoltál. Az általam megadott eseteket össze kell vonni vagy sem? Mi a logika, mert amit eddig leírtál annak semmi értelme.
Egyszerű kérdést tettem fel, amire a válasz gyakorlatilag igen/nem (összevonni/nem összevonni) Légyszíves arra válaszolj.
Vagy írd le, ha hülyeség a példa és nem lehet olyan, hogy 1,2,3,5 valami miatt.... de akkor indokold meg, hogy ez a felsorolás hülyeség, mert...?
#7 Köszönöm! Megnézem, hogyan tudom beletenni a lekérdezésbe.
#8 Elnézést, nem olvastam figyelmesen, akkor leírom.
Hasonló átfedés mint ami a példádban szerepel, nem fog előfordulni, így azzal nem kell foglalkozni.
var q = from akt in dt.AsEnumerable()
group akt by new
{
felev = new CustomString(akt.Field<string>("felev")),
nap = akt.Field<string>("nap")
}
into g
select new
{
felev = g.Select(x => x.Field<string>("felev")).OrderByDescending(x => x.Length).First(),
nap = g.Key.nap
};
Ahol:
class CustomString
{
public string Str { get; }
public CustomString(string str)
{
Str = str;
}
public override int GetHashCode()
{
return 0;
}
public override bool Equals(object obj)
{
var other = (CustomString) obj;
return Str.Contains(other.Str) || other.Str.Contains(Str);
}
}
Persze ez nem szép, de azt csinálja amit szeretnél, ha jól értem. A kérdésben részhalmaz szerepel, itt errl nicns szó. Azt vizsgálja, hogy az egyik string részstrinhje-e a másiknak. Ahogy te akartad.
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!