我有一个数组statsname为
apple
X
banana
Y
Kiwi
z
我需要将苹果,香蕉和猕猴桃放入数组中,将水果和X,Y和Z放在一个名为字母的数组中。
请问任何简单的C#机制吗?
答案 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();
然后你有一份清单清单:
答案 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)(_))