Skip to content

Instantly share code, notes, and snippets.

@PhiHuyHoang
Created September 21, 2018 15:01
Show Gist options
  • Save PhiHuyHoang/38454f983f413551da08de6054f8fff3 to your computer and use it in GitHub Desktop.
Save PhiHuyHoang/38454f983f413551da08de6054f8fff3 to your computer and use it in GitHub Desktop.
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