选择数组的备用项C#

时间:2013-11-22 09:25:06

标签: c# arrays alternate

我有一个数组statsname为

apple
X
banana
Y
Kiwi
z

我需要将苹果,香蕉和猕猴桃放入数组中,将水果和X,Y和Z放在一个名为字母的数组中。

请问任何简单的C#机制吗?

9 个答案:

答案 0 :(得分:8)

How to get Alternate elements using Enumerable in C#

被盗
var fruits = myArray.Where((t, i) => i % 2 == 0).ToArray();
var alphabets = myArray.Where((t, i) => i % 2 == 1).ToArray();

答案 1 :(得分:7)

使用提供索引的IEnumerable<T>.Where重载。

var fruits = statsname.Where((s, i) => i % 2 == 0).ToArray();
var alphabets = statsname.Where((s, i) => i % 2 != 0).ToArray();

答案 2 :(得分:2)

如果我理解你正确地问你想要什么很简单: 您希望将fruits放在fruits的数组中,对于字母表也是如此,它们会在数组statsname中出现,所以:

for(int i=0,j=0;i<statsname.length;i+2,j++)
    fruits[j]=statsname[i];

for(int i=1,j=0;i<statsname.length;i+2,j++)
    alphabets[j]=statsname[i];

答案 3 :(得分:2)

Single LINQ:

List<string> list = new List<string>() { "apple", "X", "banana", "Y", "Kiwi", "z" };
var result = list.Select((l, i) => new { l, i })
                 .GroupBy(p => p.i % 2)
                 .Select(x => x.Select(v => v.l).ToList())
                 .ToList();

然后你有一份清单清单:

Linq result

答案 4 :(得分:1)

list<string> fruits = new List<string>();
list<string> alphabet = new List<string>();

for (int i = 0; i < array.Length; i++)
{
   if (i % 2 == 0)
       fruits.Add(array[i]);
   else
       alphabet.Add(array[i]);
}

然后你就可以在列表上做.ToArray

答案 5 :(得分:1)

string[] rawarray = new string [] {"Apple","X" .....};
string[] Fruites = new string[rawarray.Length/2+1];
string[] Alphabets = new string[rawarray.Length/2];

For(int i=0; i<rawarray.Length;i++)
{
   if(i%2==0)
   {
     Fruits[i/2]=rawarray[i]; 
   }
   else
   {
     Alphabets[i/2]=rawarray[i]; 
   }   
}

答案 6 :(得分:1)

仅使用Arrays

 var array = new string[] { "apple", "X", "banana", "Y", "Kiwi", "z" };
 var fruit = new string[array.Length];
 var alphabet = new string[array.Length];
 for(var i = 0,j = 0; i < array.Length / 2; i++, j += 2)
 {
     fruit[i] = array[j];               
     alphabet[i] = array[j + 1];
 }

答案 7 :(得分:0)

你可以创建一个只跳过其他所有元素的迭代器。我们的想法是拥有一个集合的“视图”,特殊的可枚举,它只返回一些元素:

  static IEnumerable<T> everyOther<T>( IEnumerable<T> collection )
  {
    using( var e = collection.GetEnumerator() ) {
      while( e.MoveNext() ) {
        yield return e.Current;
        e.MoveNext(); //skip one
      }
    }
  }

您可以使用System.Linq.Skip跳过第一个元素。

string[] words = "apple X banana Y Kiwi z".Split();

var fruits = everyOther( words );
var alphabets = everyOther( words.Skip(1) );

只需将它们用作新收藏品或致电.ToArray().ToList()

foreach( string f in fruits )
  Console.WriteLine( f );

string[] anArray = fruits.ToArray();  //using System.Linq

现在你拥有了你需要的东西。

迭代器是yield return的方法,请参阅Iterators (C# Programming Guide)。这是该语言非常强大的功能。你可以:

答案 8 :(得分:-2)

以下是一些正常工作的代码,希望这对您有所帮助:

import scalaz._, Scalaz._
implicit val inst: Monoid[Option[Int]] = 
  Tags.First.unsubst(scalaz.std.option.optionFirst[Int])

val foo: Int => Option[Int] = x => if (x % 2 == 0) Some(x) else None
val bar: Int => Option[Int] = x => if (x % 3 == 0) Some(x) else None
val xs = List(1, 2, 3, 4, 5, 6, 7, 8)

xs.flatMap((foo |+| bar)(_))