2009-12-16 114 views
24

我有对象的数组(车载[]例如)并且有一个IsAvailable属性的对象上滤波器在C#阵列

我想使用的全阵列(其中IsAvailable为一些项目真实和为其他人为false)作为输入并返回一个只包含IsAvailable = true的项的新数组。

回答

43

如果您正在使用C#3.0或更好...

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(); 
} 
+0

考虑到LINQ的实现是基于IQueryable的,它的实现怎么会比基于List的更好呢? – LorenVS 2009-12-16 03:54:19

+0

IEnumerable ***(15chars) – LorenVS 2009-12-16 03:54:51

+0

不是。我发布了它,以防OP使用旧版本的.NET。如果OP需要性能最高的代码,他们至少可以从第二个例子中得到想法......并对其进行优化以满足他们的需求。 – 2009-12-16 03:55:52

1

最简单的方法:

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(); 
1

一个简单的解决方案是创建一个新的数组,循环通过输入阵列和只添加满足您的条件下与新的数组的那些项目,并返回新的数组:

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. 
+0

你有java的foreach,我相信... – LorenVS 2009-12-16 03:53:11

+0

Aww drat。你是对的=) – goatlinks 2009-12-16 04:00:06

0
var available = from c in cars where c.IsAvailable == true select c; 

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

可以省略显式比较对'''true''',即:'var'available = cars.Where(c => c.IsAvailable);''' – 2014-12-23 16:10:29

-5

阵列是滤光器阵列时,它满足以下条件:

  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 universtity woliso campuse信息技术部。

+0

这不是过滤数组。这是返回某些值是否在数组中,以非常糟糕的方式。 – Archer 2014-02-12 11:54:19

10

出人意料的是,这个问题缺乏最自然,最有效的答案:Array.FindAll

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

,如果它是一个List<Car>还出现了一个List.FindAll

+0

我调整了你的介绍。没什么大不了的,但我希望我在那里正确理解你。 – jpaugh 2016-09-20 01:10:52