如何用C# LINQ计算共享最多Token的好友ID对乘积?
用LINQ实现好友ID乘积计算的方案
当然可以用LINQ完美实现这个需求,甚至能把筛选和计算逻辑整合得更简洁高效。我给你两种实用方案,你可以根据场景选择:
方案1:在现有筛选结果上扩展计算
如果你已经需要保留FriendsWhoShareTheMostTokens这个集合做其他操作,直接在它上面追加乘积计算即可:
// 生成包含ID乘积的新集合 var topFriendPairsWithProduct = FriendsWhoShareTheMostTokens .Select(pair => new { pair.FriendIdA, pair.FriendIdB, pair.SharedCountNumber, // 用long类型避免整数溢出(如果ID是int的话) IdProduct = (long)pair.FriendIdA * pair.FriendIdB }) .ToList(); // 遍历使用示例 foreach (var pair in topFriendPairsWithProduct) { // 这里可以替换成你的业务逻辑 Console.WriteLine($"好友对 {pair.FriendIdA} & {pair.FriendIdB} | 共享Token数:{pair.SharedCountNumber} | ID乘积:{pair.IdProduct}"); }
方案2:一步整合筛选+计算(性能更优)
如果不需要单独保留筛选后的好友对集合,推荐把“找最大共享数、筛选好友对、计算乘积”三步合并成一个LINQ链式调用,减少中间集合的创建,性能更高效:
var topFriendPairsWithProduct = FriendsWithTheirSharedTokensAmount // 按共享Token数分组 .GroupBy(x => x.SharedCount) // 按共享数从高到低排序 .OrderByDescending(g => g.Key) // 取共享数最多的那一组(空集合场景可替换为FirstOrDefault()避免异常) .First() // 转换为包含乘积的对象 .Select(x => new { FriendIdA = x.FriendTo.FriendID, FriendIdB = x.FriendFor.FriendID, SharedCountNumber = x.SharedCount, IdProduct = (long)x.FriendTo.FriendID * x.FriendFor.FriendID }) .ToList();
关键注意点
- 避免整数溢出:如果你的好友ID是
int类型,两个int相乘很容易超出int的范围(比如两个10万的ID相乘就是1010,远大于int的最大值231-1),所以强制转成long类型存储乘积更安全。 - 空集合防护:如果
FriendsWithTheirSharedTokensAmount可能为空,记得把First()替换成FirstOrDefault(),并添加空值判断,避免运行时抛出异常。
内容的提问来源于stack exchange,提问作者Curious-programmer
相关产品推荐
相关产品推荐

