Created
September 21, 2018 15:01
-
-
Save PhiHuyHoang/38454f983f413551da08de6054f8fff3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static class ConsoleExtension | |
{ | |
public static void ToConsole<T>(this IEnumerable<T> s, string header) | |
{ | |
Console.WriteLine($"*********BEGIN {header}**************"); | |
foreach (T item in s) | |
{ | |
Console.WriteLine(item); | |
} | |
Console.WriteLine($"*********END {header}**************"); | |
Console.ReadLine(); | |
} | |
} | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
Console.InputEncoding = Encoding.Unicode; | |
Console.OutputEncoding = Encoding.Unicode; | |
XDocument doc = XDocument.Load("http://users.nik.uni-obuda.hu/prog3/_data/war_of_westeros.xml"); | |
//Q1 - How many houses participated? | |
var q1Attacker = from battle in doc.Descendants("battle") | |
group battle by new | |
{ | |
attacker = battle.Element("attacker").Element("house") | |
} into g | |
select (new { house = g.Key.attacker?.Value }); | |
var q1Defender = from battle in doc.Descendants("battle") | |
group battle by new | |
{ | |
attacker = battle.Element("defender").Element("house") | |
} into g | |
select (new { house = g.Key.attacker?.Value }); | |
var q1 = from battle in q1Attacker.Concat(q1Defender) | |
where battle.house != null | |
group battle by battle.house into g | |
select new { house = g.Key }; | |
//q1.ToConsole("QUERY 1"); | |
Console.WriteLine($"QUERY 1\n{q1.Count()}"); | |
Console.ReadLine(); | |
//Q2 - List the battles with the „ambush” type! | |
var q2 = doc.Descendants("battle").Where(battle => battle.Element("type")?.Value == "ambush").Select(battle => battle.Element("name")?.Value); | |
q2.ToConsole("QUERY 2"); | |
//Q3 - How many battles are there where the defending army won and there was a major capture? | |
var q3 = doc.Descendants("battle").Where(battle => battle.Element("outcome")?.Value == "defender" && battle.Element("majorcapture")?.Value == "1").Select(battle => battle.Element("name")?.Value); | |
//q3.ToConsole("QUERY 3"); | |
Console.WriteLine($"QUERY 3\n{q3.Count()}"); | |
Console.ReadLine(); | |
//Q4 - How many battles were won by the Stark house? | |
var q4 = doc.Descendants("battle").Where(battle => (battle.Element("attacker").Element("house")?.Value == "Stark" && battle.Element("outcome")?.Value == "attacker") || | |
(battle.Element("defender").Element("house")?.Value == "Stark" && battle.Element("outcome")?.Value == "defender")). | |
Select(battle => battle.Element("name")?.Value); | |
//q4.ToConsole("QUERY 4"); | |
Console.WriteLine($"QUERY 4\n{q4.Count()}"); | |
Console.ReadLine(); | |
//Q5 - Which battles had more than 2 participating houses? | |
var q5 = from battle in doc.Descendants("battle") | |
let attacker = battle.Element("attacker").Element("house")?.Value | |
let defender = battle.Element("defender").Element("house")?.Value | |
select new { battle.Element("name")?.Value, attacker, defender }; | |
q5.ToConsole("QUERY 5"); | |
//Q6 - Which are the 3 most violent regions? | |
var q6 = from battle in doc.Descendants("battle") | |
group battle by battle.Element("region")?.Value into g | |
select new { Region = g.Key, count = doc.Descendants("battle").Count(q => q.Element("region")?.Value == g.Key) }; | |
q6.OrderByDescending(g => g.count).Take(3).ToConsole("QUERY 7"); | |
//Q7 - Which one is the most violent region? | |
var q7 = q6.OrderByDescending(g => g.count).FirstOrDefault(); | |
Console.WriteLine(q7); | |
Console.ReadLine(); | |
//Q9 - List the houses ordered descending by the number of battles won! | |
var q9attacker = from battle in doc.Descendants("battle") | |
where battle.Element("outcome")?.Value == "attacker" | |
select new | |
{ | |
winner = battle.Element("attacker").Element("house")?.Value, | |
loser = battle.Element("defender").Element("house")?.Value | |
}; | |
var q9defender = from battle in doc.Descendants("battle") | |
where battle.Element("outcome")?.Value == "defender" | |
select new | |
{ | |
winner = battle.Element("defender").Element("house")?.Value, | |
loser = battle.Element("attacker").Element("house")?.Value | |
}; | |
var q9 = from battle in q9attacker.Concat(q9defender) | |
select new { house = battle, count = q9attacker.Concat(q9defender).Count(x => x.winner == battle.winner) }; | |
q9.OrderByDescending(c => c.count).ToConsole("QUERY 9"); | |
//Q11 - List the three commanders who attacked the most often! | |
var q11attacker = from commander in (from battle in doc.Descendants("battle") | |
where battle.Element("attacker").Element("commanders") != null | |
select new | |
{ | |
attacker = battle.Element("attacker").Element("commanders") | |
}) | |
select new | |
{ | |
commander = commander.attacker.Element("commander")?.Value, | |
}; | |
var q11attackerGroup = from commander in q11attacker | |
group commander by commander.commander into g | |
select new { commander = g.Key }; | |
var q11defender = from commander in (from battle in doc.Descendants("battle") | |
where battle.Element("defender").Element("commanders") != null | |
select new | |
{ | |
defender = battle.Element("defender").Element("commanders") | |
}) | |
select new | |
{ | |
commander = commander.defender.Element("commander")?.Value, | |
}; | |
var q11defenderGroup = from commander in q11defender | |
group commander by commander.commander into g | |
select new { commander = g.Key }; | |
var q11 = from commander in q11attackerGroup.Concat(q11defenderGroup) | |
group commander by commander.commander into g | |
select new { commander = g.Key, count = q11attackerGroup.Concat(q11defenderGroup).Count(x=> x.commander == g.Key) }; | |
q11.OrderByDescending(x => x.count).Take(3).ToConsole("QUERY 11"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment