+3  A: 
var all = from item in list
group item by item.Country into byCountry
let count = byCountry.Sum(element=>element.Value)
orderby count descending
select byCountry.Key, count

var justTop = all.Take(3);

Not entered into a compiler, but that should be the easy bit - Donwload LINQPad, look at the LINQPad tutorials on http://dimecasts.net and you'll have it sorted :P

Ruben Bartelink
doesn't compile...
Mitch Wheat
@Mitch Wheat: Thanks. I thought a non-tested answer was an appropriate response for what still seems either homework or research more than anything. I thought it was mildly useful if the OP had a genuine need to resolve an issue but was stumbling, and still now gives the expression syntax instead of the extension chaining syntax so is sufficiently different. Do you want me to delete it - no skin off my nose? Ideally our OP would step in and tell us what's worked.
Ruben Bartelink
Considering the poor quality of the question, I think this is a perfectly reasonable answer (after the edit). Especially the part about LINQPad. Leave it here.
StriplingWarrior
@StriplingWarrior: Thanks (and for the +1)! (And a +1 for the lates rev of your answer!)
Ruben Bartelink
I really do not see that the question was "poor quality". Data was illustrated, algorithm explained, expected answer produced...
Andrew White
Indeed, certain aspects of the question were much better quality than a lot of what you find here. My big concern was that it appeared you were expecting us to do the thinking for you. As far as I could tell, the solution was just a matter of translating the requirements to LINQ. From a professional standpoint, SO users would like to know what pitfall you fell into that prevented you from solving it on your own.
StriplingWarrior
+5  A: 

I didn't have time to fully comment this when I answered it over the weekend, but I had a few things I wanted to say. First of all, I agree with commenters that this sounds an awful lot like homework. If you had tried something and were running into trouble, I would expect to hear where your trouble spot is. Stack Overflow is about professionals helping one another with specific problems when they have tried everything and can't quite get it right. This question has a trivial response (for anyone who has taken time to read a little about LINQ). I intentionally used chained lambda notation rather than a LINQ expression in order to point out how the response is really a direct translation of the question:

var results = list.GroupBy(e => e.Country) // group the list by country
    .OrderByDescending(                 // then sort by the summed values DESC
        g => g.Sum(e => e.Value))  
    .Take(n)                            // then take the top X values
    .Select(                            // e.g. List.TopX(3) would return...
        r => new {Country = r.Key, Sum = r.Sum(e => e.Value)}); 

If I were actually doing this for work, I would use the following notation:

var results = from e in list
              group e.Value by e.Country into g
              let sum = g.Sum()
              orderby sum descending
              select new {g.Key, sum};
results = results.Take(n);
StriplingWarrior
I do not see anything in Stackoverflow's mission statement that it is only for professionals. I am a hobby programmer and just getting to grips with Linq.If questions sound like homework you have no obligation to answer them. I appreciate your answer though.
Andrew White
@Andrew: You're right. I have learned a lot more about StackOverflow's founding principles lately and I'm working on aligning myself closer to them. Thanks for the feedback, and sorry for being snarky.
StriplingWarrior