2

这是函数,我使用排列列表:

public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list)
        {
            if (list.Count() == 1)
                return new List<IEnumerable<T>> { list };

            return list.Select((a, i1) => Permute(
                            list.Where((b, i2) => i2 != i1)).Select(
                                    b => (new List<T> { a }).Union(b))
                            ).SelectMany(c => c);
        }

按以下方式使用它:

var SFP_vars = Permute(SFP);

其中 SFP 是字节数组:

byte[] SFP = new byte[7] { 0, 1, 2, 3, 4, 5, 6 };

还有其他变量:

List<byte[]> lst_SFP = new List<byte[]>();

现在我的问题是:如何将 SFP_vars 的值分配给 lst_SFP ? lst_SFP = SFP_vars.ToList()不起作用。

4

4 回答 4

1
lst_SFP = SFP_vars.Select(bytePermutation => bytePermutation.ToArray()).ToList()

基本上,您希望列表中的内容是一个字节数组,因此Select语句会处理它,给您一个IEnumerable<byte[]>.
然后我们这样做ToList以使其成为一个列表。

bytePermutation可以命名任何东西,我只是这样命名它,这样你就可以了解发生了什么。

于 2013-04-12T10:28:58.337 回答
1

您还需要将内部枚举转换为byte数组:

lst_SFP = SFP_vars.Select(x => x.ToArray()).ToList();
于 2013-04-12T10:29:21.627 回答
1

SFP_vars 看起来像一个IEnumerable<IEnumerable<byte>>而不是一个IEnumerable<byte[]>.

这意味着您首先需要将IEnumerable<byte>对象转换为byte[]使用 ToArray() 方法。然后,您可以将它们添加到列表中。

虽然它相当于同一件事,但您可以用这个 LINQ 查询替换:

List<byte[]> lst_SFP = SFP_vars.Select(ie => ie.ToArray()).ToList();

希望这可以帮助。

于 2013-04-12T10:31:54.767 回答
0

您需要将内部IEnumerable<byte>转换为数组,这可以使用.Select(). 完成的一个.ToList()将作为List<byte[]>.

var SFP = new byte[7] { 0, 1, 2, 3, 4, 5, 6 };
var SFP_vars = Permute(SFP);
var lst_SFP = SFP_vars
    .Select(e => e.ToArray())
    .ToList();

除非您需要特定的订单,否则最好使用List<IEnumerable<byte>>. 使用它会阻止Array.Copy

于 2013-04-12T10:32:18.750 回答