gpt4 book ai didi

C# 列表 - 分组依据 - 没有 Linq

转载 作者:太空宇宙 更新时间:2023-11-03 17:11:49 25 4
gpt4 key购买 nike

我有一个对象:

IObject
{
string Account,
decimal Amount
}

我如何按帐户分组并对金额求和,在没有 Linq 的情况下返回列表。

2.0 框架……这就是没有 Linq 的原因。

这是我的:

    ListofObjects = List<IObject>;

foreach (var object in objects)
{
var objectToAdd = new Object(object);

var oa = ListofObjects.Find(x => x.Account == objectToAdd.Account);

if (oa == null)
{
ListofObjects.Add(objectToAdd);
}
else
{
ListofObjects.Remove(oa);
oa.Amount = objectToAdd.Amount;
ListofObjects.Add(oa);
}


}

最佳答案

最简单的答案:使用 LINQBridge并让您所有的 LINQ to Objects 优点都针对 .NET 2.0...如果您可以使用 C# 3(即 VS2008,但以 .NET 2.0 为目标),效果最佳。

如果您真的做不到,您基本上需要保留从键到值列表的字典。遍历序列,检查它是否已经包含一个列表——如果没有,添加一个。然后添加到您找到的任何列表(无论是新的还是旧的)。

如果您需要按键顺序返回组,您还需要按照找到它们的顺序保存一个键列表。坦率地说,这很痛苦……只需改用 LINQBridge :)

(说真的,LINQ 的每一部分实际上都相当容易编写 - 但它也很容易犯一个错误,或者最终忘记优化像 Count() 这样的东西,如果它实际上是一个ICollection<T> ...这里不需要重新发明轮子。)

编辑:我正要写一些代码,但后来我注意到您想要返回一个列表...什么的列表? List<IList<IObject>> ?还是您实际上是在尝试一次分组和求和?如果是这样,您不想要一个键和数量对的列表吗?或者您是否要为一个单个 帐户重用您已经获得的相同类,但作为聚合?如果是后者,这里有一些示例代码:

public static IList<IObject> SumAccounts(IEnumerable<IObject> data)
{
List<IObject> ret = new List<IObject>();
Dictionary<string, IObject> map = new Dictionary<string, IObject>();

foreach (var item in data)
{
IObject existing;
if (!map.TryGetValue(item.Account, out existing))
{
existing = new IObject(item.Account, 0m);
map[item.Account] = existing;
ret.Add(existing);
}
existing.Amount += item.Amount;
}
return ret;
}

无可否认,由于使用 Dictionary,这里的效率更高因为查找将毫无意义,除非您真的有很多帐户...

编辑:如果根据您的评论,您的帐户数量较少,您可以使用:

public static IList<IObject> SumAccounts(IEnumerable<IObject> data)
{
List<IObject> ret = new List<IObject>();

foreach (var item in data)
{
IObject existing = ret.Find(x => x.Account == item.Account);
if (existing == null)
{
existing = new IObject(item.Account, 0m);
ret.Add(existing);
}
existing.Amount += item.Amount;
}
return ret;
}

关于C# 列表 - 分组依据 - 没有 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1460309/

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