将IQueryable <List <object >>拆分为不同部分并过滤每个部分的最佳方法

时间:2019-07-12 06:43:11

标签: c# .net list iqueryable

我有一个IQueryable<List<object>>对象的结构只是一个x值和y值。 我还有另一个只包含双精度值的列表。 我的目标是根据列表中的double值拆分IQueryable,然后对每个拆分的部分进行区分。

例如:

可查询项:

var preparedQuery = new List<IReadOnlyList<object>>
{
    new List<object> { 100, 10 },
    new List<object> { 111, 20 },
    new List<object> { 112, 30 },
    new List<object> { 117, 60 },
    new List<object> { 150, 80 },
    new List<object> { 170, 90 },
    new List<object> { 257.527, 200 },
    new List<object> { 247.527, 100 }
}.AsQueryable();

列表:

var list = new List<double>
{
    50, 100, 150, 200, 250, 300
}

这些部分现在应该是这样的(每个部分都包含对象,其中Queryable的x值为> =该部分的double值,而x-value <下一部分的double值):

部分为双精度值50(所有值在50-99之间):空

部分为双精度值100(所有值在100-149之间):

new List<object> { 100, 10 },
new List<object> { 111, 20 },
new List<object> { 112, 30 },
new List<object> { 117, 60 }

双精度值150部分(所有值在150-199之间):

new List<object> { 150, 80 },
new List<object> { 170, 90 },

部分为双精度值200:

new List<object> { 247.527, 100 }

部分为双精度值250:

new List<object> { 257.527, 200 }

双精度值300部分:空

在拆分这些值之后,应该在每个部分上执行一个distinct(),然后我希望将它们重新组合到一个Queryable中。 现在,我想查找一个Linq语句,它可以解决此问题。

2 个答案:

答案 0 :(得分:0)

您可以将Linq的GroupBy扩展名与List.BinarySearch(T, IComparer)一起用于IQueryable源,以从排序列表中查找分组键。

答案 1 :(得分:0)

static void Main(string[] args)
{
    var preparedQuery = new List<IReadOnlyList<object>>
    {
        new List<object> { 100, 10 },
        new List<object> { 111, 20 },
        new List<object> { 111, 20 },
        new List<object> { 112, 30 },
        new List<object> { 117, 60 },
        new List<object> { 150, 80 },
        new List<object> { 170, 90 },
        new List<object> { 257.527, 200 },
        new List<object> { 247.527, 100 }
    }.AsQueryable();

    var list = new List<double>
    {
        50, 100, 150, 200, 250, 300
    };

    var preparedQuery1 = new List<IReadOnlyList<object>>();

    for (int i = 0; i < list.Count - 1; i++)
    {
        var s1 = preparedQuery
                    .Where(x => Convert.ToDouble(x[0]) >= list[i] 
                                && Convert.ToDouble(x[0]) < list[i+1] - 1)
                                .GroupBy(x1 => x1[0])
                    .ToList();

        var s2 = s1.Distinct().ToList(); // not sure this :)

        preparedQuery1.Add(s2);
    }
}