3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個贊
你可以很容易地使用 Linq 做到這一點(diǎn)
假設(shè)您的 Animal Type 聲明為
public class Animal
{
public string Name {get;set;}
public int Age{get;set;}
public string Gender {get;set;}
}
您可以按名稱對重復(fù)項(xiàng)進(jìn)行分組并計算年齡總和。
var list = new List<Animal>{
new Animal{Name="Ant",Age=9,Gender="M"},
new Animal{Name="Ant",Age=2,Gender="M"},
new Animal{Name="Lion",Age=8,Gender="M"},
new Animal{Name="Pig",Age=1,Gender="F"},
};
list.AddRange( list.GroupBy(x=>x.Name)
.Where(x=>x.Count()>1)
.Select(x=> new Animal{Name = x.First().Name, Gender= x.First().Gender, Age = x.Sum(c=>c.Age)}));
輸出
Name Age Gender
Ant 9 M
Ant 2 M
Lion 8 M
Pig 1 F
Ant 11 M

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個贊
var animals = new List<Animal>
{
new Animal { Name = "Ant", Age = 9, Gender = "M"},
new Animal { Name = "Ant", Age = 2, Gender = "M"},
new Animal { Name = "Lion", Age = 8, Gender = "M"},
new Animal { Name = "PIG", Age = 1, Gender = "F"},
};
var new_animals =
from animal in animals
group animal by animal.Name into grp
where grp.Count() >= 2
select new Animal
{
Name = grp.Key,
Age = grp.Sum(a => a.Age),
Gender = "M"
};
animals.AddRange(new_animals);
foreach(var animal in animals)
{
WriteLine(animal);
}

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個贊
您的代碼會覆蓋現(xiàn)有的動物,因?yàn)槟鷽]有為總數(shù)創(chuàng)建新的動物new Animal()。
在重復(fù)項(xiàng)下方的正確位置獲取重復(fù)項(xiàng)總計非常棘手。為此,我將創(chuàng)建一個新類,Animal以便能夠?qū)游锱c總數(shù)記錄區(qū)分開來。
class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
}
class AnimalTotals : Animal
{
}
像這樣創(chuàng)建重復(fù)的總計:
var duplicateTotals = listAnimals
.GroupBy(a => (a.Name, a.Gender))
.Where(g => g.Count() > 1)
.Select(g => new AnimalTotals {
Name = g.Key.Name,
Age = g.Sum(a => a.Age),
Gender = g.Key.Gender
});
請注意,我使用值元組(在 C# 7.0 中引入)來創(chuàng)建由名稱和性別組成的組鍵。
然后我將重復(fù)的總數(shù)與現(xiàn)有列表合并,并對結(jié)果進(jìn)行排序以獲得重復(fù)項(xiàng)下方的總數(shù)。
listAnimals = listAnimals
.Concat(duplicateTotals)
.OrderBy(a => a.Name)
.ThenBy(a => a.Gender)
.ThenBy(a => a is AnimalTotals ? 1 : 0)
.ToList();
有了這個樣本數(shù)據(jù)
var listAnimals = new List<Animal> {
new Animal{ Name="Ant", Age = 9, Gender = "M" },
new Animal{ Name="Ant", Age = 2, Gender = "M" },
new Animal{ Name="Ant", Age = 5, Gender = "F" },
new Animal{ Name="Ant", Age = 1, Gender = "F" },
new Animal{ Name="Lion", Age = 8, Gender = "M" },
new Animal{ Name="Pig", Age = 1, Gender = "F" },
};
的輸出
foreach (Animal a in listAnimals) {
if (a is AnimalTotals) {
Console.WriteLine($"{a.Name} {a.Gender} totals: {a.Age,4}");
} else {
Console.WriteLine($"{a.Name,-6} {a.Age,2} {a.Gender}");
}
}
是
Ant 5 F
Ant 1 F
Ant F totals: 6
Ant 9 M
Ant 2 M
Ant M totals: 11
Lion 8 M
Pig 1 F
- 3 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報