亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

添加字段時的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 關注
  • 148 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號