gpt4 book ai didi

c# 使用 LiNQ 删除 Datatable 中的多行

转载 作者:行者123 更新时间:2023-11-30 20:35:12 25 4
gpt4 key购买 nike

这应该很简单,但我无法弄明白。我有一个数据表,其中包含姓名、年龄,其中有包含学生姓名的行,但还有多行特殊学生的姓名“Chris”和“John”。最终结果应该有一个表格,其中包含除 Chris 和 John 之外的所有行,并将其合并到名为 Other 的一行中,并加上他们的年龄总和。

即。

NAME | AGE
Tom | 20
John | 15
Peter | 5
John | 2
Tom | 33
Chris | 20

最终结果:

NAME | AGE
Tom | 20
Peter | 5
Tom | 33
Other | 37

这就是我现在正在做的:

var others = table.AsEnumerable().Where(x => x["NAME"].ToString().Equals("Chris") || x["NAME"].ToString().Equals("John"));
var tmpOthers = 0;
foreach (DataRow otherRow in others)
tmpOthers += decimal.Parse(otherRow["AGE"].ToString());
table = table.AsEnumerable().Where(x => !x["NAME"].ToString().Equals("Chris") || !x["NAME"].ToString().Equals("John")).CopyToDataTable();
table.Add(//OTHER-ROW-Here)

这行得通,但我知道必须有更简单的方法在单个 LiNQ 语句中执行此操作。由于迭代更改,我也无法将 table.Rows.Remove 放在同一个 for 循环中。

最佳答案

我会使用 Linq + delegate 来做到这一点。为什么?对于这种情况,使用委托(delegate)的解决方案更优雅、更具体,因为名称可能以大写字母或小写字母开头。检查以下解决方案:

//delegate to return "Other" for {"Chris","John"} - ignoring case
Func<string, string> GetOtherName = delegate(string s)
{
if(string.Equals(s, "Chris", StringComparison.OrdinalIgnoreCase) ||
string.Equals(s, "John", StringComparison.OrdinalIgnoreCase))
return "Other";
else
return s;
};

//get total age for "Other"
var otherAge = dt.AsEnumerable()
.Where(x=>GetOtherName(x.Field<string>("NAME")) == "Other")
.Select(x=>x.Field<int>("AGE")).Sum();

//remove "Other" rows
dt.AsEnumerable()
.Where(x=>GetOtherName(x.Field<string>("NAME")) == "Other")
.ToList()
.ForEach(r=>r.Delete());

//finally add "other" row
dt.Rows.Add(new object[]{"Other", otherAge});

结果:

NAME  AGE
Tom 20
Peter 5
Tom 33
Other 37

更多详情,请参阅:Func Delegate

关于c# 使用 LiNQ 删除 Datatable 中的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38313997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com