【问题标题】:filter an array in C#在 C# 中过滤数组
【发布时间】:2009-12-16 03:47:08
【问题描述】:

我有一个对象数组(例如 Car[])并且对象上有一个 IsAvailable 属性

我想使用整个数组(其中 IsAvailable 对某些项目为真,而对另一些项目为假)作为输入并返回一个新数组,其中仅包含 IsAvailable = true 的项目。

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    如果您使用的是 C# 3.0 或更高版本...

    using System.Linq;
    
    public Car[] Filter(Car[] input)
    {
        return input.Where(c => c.IsAvailable).ToArray();
    }
    

    如果您无法访问 LINQ(您使用的是旧版本的 .NET)...

    public Car[] Filter(Car[] input)
    {
        List<Car> availableCars = new List<Car>();
    
        foreach(Car c in input)
        {
            if(c.IsAvailable)
                availableCars.Add(c);
        }
    
        return availableCars.ToArray();
    }
    

    【讨论】:

    • 考虑到 LINQ 实现是建立在 IQueryable 之上的,它的实现怎么可能比基于 List 的更好呢?
    • 不是。我发布它以防 OP 使用的是旧版本的 .NET。如果 OP 需要最高性能的代码,他们至少可以从第二个示例中获得灵感……并对其进行优化以满足他们的需求。
    • Nope :),仍然很困惑...我想知道您为什么对第二种方法而不是第一种方法表示性能问题...(只是吹毛求疵,我认为您的解决方案很棒) ...
    • 在第二个示例中,我使用 List 来存储元素,然后使用 .ToArray() 方法将它们输出。我想必须有一种更清洁的方式来完成这项工作......我希望如果存在的话,LINQ to Objects 会使用它。我会打破 Reflector,但我现在在我的 Mac 上。
    • 第一个sn-p这个答案是不是缺少using System.Linq;
    【解决方案2】:

    令人惊讶的是,这个问题缺乏最自然和最有效的答案:Array.FindAll

    Car[] availableCars = Array.FindAll(cars, c => c.IsAvailable);
    

    如果是List&lt;Car&gt;,那么还有List.FindAll

    【讨论】:

    • 我调整了你的介绍。没什么大不了的,但我希望我理解正确。
    【解决方案3】:

    最简单的方法:

    Car[] cars = //...
    Car[] filtered = cars.Where(c => c.IsAvailable).ToArray();
    

    可能更高效:

    Car [] cars = //...
        List<Car> filteredList = new List<Car>();
        for(int i = 0; i < cars.Length; i++)
        {
            if(cars[i].IsAvailable)
               filteredList.Add(cars[i]);
        }
        Car[] filtered = filteredList.ToArray();
    

    【讨论】:

      【解决方案4】:

      一个简单的解决方案是创建一个新数组,遍历输入数组,只将满足条件的项添加到新数组中,然后返回新数组:

      List<Car> available = new List<Car>();
      foreach (Car c in cars) {
          if (c.IsAvailable) {
              available.add(c);
          }
      }
      //Here you can either just return the list, or create an array from it.
      

      【讨论】:

        【解决方案5】:
        var available = from c in cars where c.IsAvailable == true select c;
        

        或者

        var available = cars.Where(c => c.IsAvailable == true);
        

        【讨论】:

        • 可以省略与true的显式比较,即:var available = cars.Where(c =&gt; c.IsAvailable);
        【解决方案6】:

        满足以下条件的数组为过滤数组:

        1. 如果列表中存在 9 则 13 也必须存在
        2. 如果列表中存在 7,则 11 一定不存在

        解决方案

        int[] a = {7 , 72, 6, 13, 9 };
        int i, k = 0, l = 0, m = 0, n = 0;
        for (i = 0; i < a.Length; i++)
        {
            if (a[i] == 9)
            {
                k = 1;
            }
        }
        for (i = 0; i < a.Length; i++)
        {
            if (a[i] == 13)
            {
                l = 1;
            }
        }
        for (i = 0; i < a.Length; i++)
        {
            if (a[i] == 7)
            {
                m = 1;
            }
        }
        for (i = 0; i < a.Length; i++)
        {
            if (a[i] == 11)
            {
                n= 1;
            }
        }
        if ((k == 1 && l == 1) && (m == 1 && n == 1))
        {
            Console.WriteLine("is not filter array");
        }
        else if (k == 1 && l!= 1)
        {
            Console.WriteLine("is not filter array");
        }
        else if (m ==1 && n==1)
        {
            Console.WriteLine("is not filter array ");
        }
        else
            Console.WriteLine("is filter array");
        Console.WriteLine("the element of an array is:");
        for (i = 0; i < a.Length; i++)
        {
            Console.WriteLine(a[i]);
        }
        

        如果您需要测试数组,我认为这段代码肯定适用。
        reta seboka ambo 大学 woliso Campuse 信息技术系!!

        【讨论】:

        • 这不是过滤数组。这是返回某些值是否在数组中,以一种非常糟糕的方式。
        猜你喜欢
        • 2014-07-05
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 1970-01-01
        • 2016-03-28
        • 2019-01-18
        相关资源
        最近更新 更多