c# - 如何将自己的方法变成可链接的 LINQ 方法?
问题描述
我有这样的代码,它将数据从输入集合构建为特定格式,并附加一个校验和值:
var data = input.Aggregate(new List<byte>(), (list, item) =>
{
list.Add(item.x);
list.Add(item.y);
list.Add(item.bytes.Length);
list.AddRange(item.bytes);
});
data.Add(Checksum(data));
var bytes = data.ToArray();
我有兴趣将其设为单行,但我看不到如何将当前具有签名的链接链接data
到其中。Checksum()
byte Checksum(IEnumerable<byte> input)
我以为我可以做类似的事情:
IEnumerable<byte> AddCheckSum(IList<byte> input)
{
return input.Add(Checksum(input));
}
var data = input.Aggregate(new List<byte>(), (list, item) =>
{
list.Add(item.x);
list.Add(item.y);
list.Add(item.bytes.Length);
list.AddRange(item.bytes);
}).AddChecksum().ToArray();
但我不知道怎么做。是直截了当吗?
解决方案
我怀疑你是否想要Aggregate
;LinqSelectMany
使用and似乎更简洁易读Concat
:
var data = input
.SelectMany(item => new byte[] {item.x, item.y, item.bytes.Length}.Concat(item.bytes));
var bytes = data
.Concat(new byte[] {Checksum(data)})
.ToArray();
但我建议foreach
使用明确的解决方案List<byte> data
:
List<byte> data = new List<byte>();
foreach (var item in input) {
data.Add(item.x);
data.Add(item.y);
data.Add(item.bytes.Length);
data.AddRange(item.bytes);
}
data.Add(Checksum(data));
var bytes = data.ToArray();
最后,如果您想一次性计算片段,可以将其包装到扩展方法中:
public static class MyInputExtensions {
public static byte[] ToBytesWithCheckSum(this IEnumerable<MyInput> input) {
if (null == input)
throw new ArgumentNullException(nameof(input));
List<byte> data = new List<byte>();
foreach (var item in input) {
data.Add(item.x);
data.Add(item.y);
data.Add(item.bytes.Length);
data.AddRange(item.bytes);
}
data.Add(Checksum(data));
return data.ToArray();
}
}
那么你可以使用ToBytesWithCheckSum()
它,就好像它是一种input
收集方法:
byte[] bytes = input.ToBytesWithCheckSum();
推荐阅读
- node.js - 反应节点下载文件
- node.js - 如何在隐藏代码的独立 PC 中部署 Angular8 应用程序
- python - 如何使用 python 请求获取特定值?
- java - FileNotFound 异常但有文件(Java Eclipse)
- c# - Pop3Client RetrieveMessageObject() 包括 .net-core 应用程序中除正文以外的所有内容
- c# - Assets/Script/Scoreboard.cs(33,2):错误 CS1525:意外符号“{”
- r - 使用离散数据自定义图例
- node.js - MongoDB $lookup 只返回一个文档
- android - 具有受限密钥的应用程序中的谷歌地图不起作用
- javascript - 检查频道名称