为了账号安全,请及时绑定邮箱和手机立即绑定

添加字段时的C#逻辑问题

添加字段时的C#逻辑问题

C#
ibeautiful 2022-06-19 09:48:24
我有一个包含 4 条记录的列表。如果有相同年龄的动物,我需要添加它们的年龄并将其添加为单独的列。例如看下表。姓名 | 年龄 | 性别蚂蚁 | 9 | 米蚂蚁 | 2 | 米狮子| 8 | 米猪 | 1 | F有 2 条记录是重复的 (Ant)。我需要添加重复项的年龄,因此会有一条新记录,例如:蚂蚁 | 11 | 米总共应该有 5 条记录以及新添加的行(在上面添加)。我面临的问题是,我能够添加新添加的记录(即通过添加年龄字段)。但是,此记录会覆盖初始字段中的第一条记录。如何将此记录添加为新字段。到目前为止我的代码:foreach (var animal in duplicates){        Animal ani = listAnimals.First(a=> a.Name.Equals(animal.Name));        ani.Age += animal.Age;}
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

你可以很容易地使用 Linq 做到这一点


假设您的 Animal Type 声明为


public class Animal

{

public string Name {get;set;}

public int Age{get;set;}

public string Gender {get;set;}

}

您可以按名称对重复项进行分组并计算年龄总和。


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 


查看完整回答
反对 回复 2022-06-19
?
大话西游666

TA贡献1817条经验 获得超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);

}


查看完整回答
反对 回复 2022-06-19
?
holdtom

TA贡献1805条经验 获得超10个赞

您的代码会覆盖现有的动物,因为您没有为总数创建新的动物new Animal()。


在重复项下方的正确位置获取重复项总计非常棘手。为此,我将创建一个新类,Animal以便能够将动物与总数记录区分开来。


class Animal

{

    public string Name { get; set; }

    public int Age { get; set; }

    public string Gender { get; set; }

}


class AnimalTotals : Animal

{

}

像这样创建重复的总计:


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 中引入)来创建由名称和性别组成的组键。


然后我将重复的总数与现有列表合并,并对结果进行排序以获得重复项下方的总数。


listAnimals = listAnimals

    .Concat(duplicateTotals)

    .OrderBy(a => a.Name)

    .ThenBy(a => a.Gender)

    .ThenBy(a => a is AnimalTotals ? 1 : 0)

    .ToList();

有了这个样本数据


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


查看完整回答
反对 回复 2022-06-19
  • 3 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信