如何使用Linq像查询C#中的数组那样查询元组?

时间:2018-09-28 22:17:10

标签: c#

<ion-item>
      <ion-range min="1" max="4" snaps="true" [(ngModel)]="fontSize" class="fontSize">
        <ion-label range-left style="font-size: 12px;">A</ion-label>
        <ion-label range-right style="font-size: 20px;">A</ion-label>
      </ion-range>
</ion-item>
<p class="fontSize" [ngClass]="{xs: fontSize===1, sm: fontSize===2, md: fontSize===3, lg: fontSize===4}">Teste</p>

上面的代码运行良好,因为它是使用Linq查询数组的简单方法。但是,当我尝试从以下位置更改时:

    static void Main(string[] args)
    {
        var primes = Tuple.Create(2, 3, 5, 7, 11, 13);
        var primes2 = new int[] { 2, 3, 5, 7, 11, 13};

        var results = primes2.Where(p => p > 3);

        foreach (int p in results)
            Console.WriteLine(p);

        Console.ReadKey();
    }

进入

    var results = primes2.Where(p => p > 3);

该代码将无法编译,因为它报告说没有为元组类型定义何处(如数组类型那样)。有没有一种解决方法,可以像使用linq查询数组一样使用linq查询元组?

1 个答案:

答案 0 :(得分:3)

Tuple代表一个对象,而不是一个集合。 Where是用于集合的IEnumerable<TSource>接口的扩展方法,因此您不能在Where对象上调用Tuple

您必须使用实现IEnumerable<TSource>的集合来携带Tuple对象数据。

var primes = Tuple.Create(2, 3, 5, 7, 11, 13);
List<int> primes_li = new List<int>()
{
    primes.Item1,
    primes.Item2,
    primes.Item3,
    primes.Item4,
    primes.Item5,
    primes.Item6
};
var results = primes_li.Where(p => p > 3);

或使用反射通过GetProperties对象通过Tuple方法获取所有项目值。

var primes = Tuple.Create(2, 3, 5, 7, 11, 13);

var results = primes.GetType()
    .GetProperties()
    .Select(x => (int)x.GetValue(primes))
    .Where(p => p > 3);

c# online

结果

5
7
11
13