![](/img/trans.png)
[英]How can I make a method in ASP.NET identity account controller return my own error message?
[英]How can I make my own method into a chainable LINQ method?
我有這樣的代碼,它將數據從輸入集合構建為特定格式,並附加一個校驗和值:
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
; Linq似乎使用SelectMany
和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();
但我建議使用顯式List<byte> data
的foreach
解決方案:
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();
最后,如果你想計算一個 go 中的片段,你可以把它包裝成一個擴展方法:
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();
使用擴展方法。
public static class AddChecksumHelpers
{
public static IEnumerable<byte> AddCheckSum(this IEnumerable<byte> input)
{
return input.Concat(new[] { CheckSum(input) });
}
}
或者,如果您有該格式的數據,您可以獲取並返回List<byte>
並直接返回輸入列表(在調用.Add(CheckSum(input))
之后)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.