2016-05-10 1 views
2

J'ai les données suivantesRESULT Range Groupe de LINQ

List<Trades> tradeList = new List<Trades>(); 
tradeList.Add(new Trades() { securityId = "JKH.N0000", principalAmount = "100.00", tradeDate ="20160401", accountNumber = "JKB831230063VN00" }); 
tradeList.Add(new Trades() { securityId = "JKH.N0000", principalAmount = "200.50", tradeDate = "20160402", accountNumber = "JKB547779605VN00" }); 
tradeList.Add(new Trades() { securityId = "COMB.N0000", principalAmount = "150.00", tradeDate = "20160403", accountNumber = "JKB831230063VN00" }); 
tradeList.Add(new Trades() { securityId = "JKH.N0000", principalAmount = "100.00", tradeDate = "20160409", accountNumber = "JKB547779605VN00" }); 
tradeList.Add(new Trades() { securityId = "GRAN.N0000", principalAmount = "200.00", tradeDate = "20160409", accountNumber = "JKB813384150VN00" }); 
tradeList.Add(new Trades() { securityId = "COMB.N0000", principalAmount = "100.00", tradeDate = "20160410", accountNumber = "JKB813384150VN00" }); 
tradeList.Add(new Trades() { securityId = "HNB.X0000", principalAmount = "100.00", tradeDate = "20160410", accountNumber = "JKB000009903FC00" }); 
tradeList.Add(new Trades() { securityId = "HNB.N0000", principalAmount = "100.00", tradeDate = "20160410", accountNumber = "JKB000000054LC00" }); 

J'ai une exigence pour obtenir la somme de principalAmount pour le groupe d'âge. Donc, je visualisais la sortie comme suit:

Age Group | Sum(principalAmount) 
0-25  | v  
25-35  | w 
35-55  | x 
55-75  | y 
75 >  | z 

Pour ce que je fait ce qui suit

var rx = new Regex("JKB([0-9]{9})(V|X)N([0-9]{2})+", RegexOptions.IgnoreCase); 

var q = tradeList 
     .Where (x => rx.IsMatch(x.accountNumber)) 
     .Select(r => new 
     { 
      accountNo = r.accountNumber, 
      dob = calculateDOB(r.accountNumber.Substring(3)), 
      Age = calculateAge(calculateDOB(r.accountNumber.Substring(3))), 
      Gender = int.Parse(r.accountNumber.Substring(3).Substring(2, 3)) > 500 ? "Female" : "Male", 
      revenue = r.principalAmount 
     }); 

Puis Groupés les données suivantes

var ceilings = new[] { 0, 25, 35, 55, 75 }; 
var q2 = q.GroupBy(item => ceilings.First(ceiling => ceiling >= item.Age)); 

Dictionary<int, decimal> counts = q2.ToDictionary(g => g.Key, (g => g.Sum(x => decimal.Parse(x.revenue.ToString())))); 

string s = string.Empty; 

foreach (KeyValuePair<int, decimal> entry in counts) 
{ 
    s += s + string.Format("Key = {0}, Value = {1}", entry.Key, entry.Value) + Environment.NewLine; 
} 

MessageBox.Show(s); 

Mais je suis obtenir les données en sortie que:

Key = 35, Value = 550.00 
Key = 75, Value = 300.50 

Ma question est Comment puis-je obtenir la valeur clé comme une chaîne dans le format des éléments suivants:

Age Group | Sum(principalAmount) 
0-25  | v  
25-35  | w 
35-55  | x 
55-75  | y 
75 >  | z 

I got direction on the following StackOverFlow Question and Answers

Répondre

2

Je suppose que 0 n'est pas vraiment une valeur plafond. En supposant également, selon votre message référencé, que la liste n'est pas fixe, nous devons donc résoudre en général.

Prenez la liste des plafonds - nous l'appellerons sourceCeilings. Je suppose que ce sera un tableau selon votre question et non une liste:

var sourceCeilings = new int?[] { 25, 35, 55, 75 }; 

Nous voulons un ensemble de « étages » pour vos plafonds. Votre question déduit que "25" est la fin d'une gamme et le début de la suivante. Donc nous irons avec ça.

var floors = new List<int?> { 0 }; 
floors.AddRange(sourceCeilings); 

Maintenant, ajoutez une valeur nulle à la fin des plafonds - nous devrons convertir dans une liste pour cela. Le nul est nécessaire pour apparier pour « 75> »:

var ceilings = sourceCeilings.ToList(); 
ceilings.Add(null); 

Maintenant, nous zipper les deux listes ensemble, la création d'une liste de sol, le plafond et Titre:

var combined = floors.Zip(ceilings, 
    (f, c) => 
     new 
     { 
      floor = f, 
      ceiling = c, 
      title = string.Format("{0} > {1}", f.Value, c.HasValue ? c.Value.ToString() : "") 
     }); 

Avec cette liste, vous pouvez effectuez votre jointure sur le plafond et sélectionnez la clé en tant que titre.