簡體   English   中英

如何將自己的方法變成可鏈接的 LINQ 方法?

[英]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似乎使用SelectManyConcat更簡潔易讀:

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> dataforeach解決方案:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM