Linq selectmany语句中如何使用方法?

时间:2019-01-24 09:43:17

标签: c# linq

如何在linq selectmany语句中使用方法?

public class BIT128Object
{
    public long High {get; set;}
    public long Low  {get; set;}
    public string Message {get; set;}
}

此类用于表示位数组中的整数索引。 我想从BIT128Object中提取所有索引。 (确实,我希望所有的索引和消息对都像一个group by) 我定义了以下方法来将高位和低位解析为int索引数组。

private int[] ParseIndices(long high, long low)
{
    List<int> indexList = new List<int>();

    BitArray highBitArr = new BitArray(BitConverter.GetBytes(high));
    if(highBitArr != null)
    {
        for (int i = 0; i < 64; ++i)
        {
            if (highBitArr.Get(i) == true)
                indexList.Add(i + 64);
            }
        }


        BitArray lowBitArr = new BitArray(BitConverter.GetBytes(low));
        if(lowBitArr != null)
        {
            for (int i = 0; i < 64; ++i)
            {
                if (lowBitArr.Get(i) == true)
                     indexList.Add(i);
            }
         }


     return indexList.ToArray();
 }

然后,有一个BIT128Object列表,其中包含1000多个元素。 我通过linq语句查询以得到每个索引的所有总数,像这样。

[Index]    [Count]    [Message]
   0          120       hello
   1          90        world
   1           3        hi
   2           3        hi
   2           2        hhhhiiii
   2           1        hiiiiii
 12231151      1        new
 12231151      1        new2222
105452984641   1        world

下面是我的linq语句。

var datum = bitObjectList.SelectMany(x => ParseIndices(x.High, x.Low)
                             .Select(z => new { 
                               Index = z,
                               Message = x.Message
                             }));

但是查询linq时会发生异常。 异常消息如下。

  

无法解析表达式'value(ClassName)',因为它不支持   类型。仅查询源(即实现   IEnumerable)和查询运算符都可以解析。

我进行了尽可能多的调试,发现无法将x.High和x.Low参数传递给ParseIndices()。似乎我必须像ParseIndices(10,10000)这样传递固定值。 在这种情况下,我似乎无法在selectmany语句中使用方法。

我可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您不能在LINQ查询中使用ParseIndices(x.High, x.Low),因为LINQ无法识别和支持它。您需要另一种方法。