选择数组的备用项C#

我有一个数组statsname为

apple X banana Y Kiwi z 

我需要把苹果,香蕉和猕猴桃放在一个数组Fruit和X,Y和Z中,这个数组叫做alphabets。

有什么简单的C#机制吗?

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

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

从如何使用C#中的Enumerable获取备用元素

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

如果我已经理解你正确地问你想要什么是非常简单的:你想要将fruits放在fruits数组中,并且对于字母表statsname如此,它们会在数组statsname中出现,所以:

 for(int i=0,j=0;i 

单LINQ:

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

然后你有一个列表列表:

林克的结果

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

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

 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 

仅使用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]; } 

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

  static IEnumerable everyOther( IEnumerable 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方法,参见迭代器(C#编程指南) 。 这是该语言非常强大的function。 您可以:

  • 跳过元素
  • 装饰元素
  • 改变排序
  • 连接序列(参见System.Linq.Concat )

这是一些工作代码,希望这对您有所帮助:

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReadFile { class Program { static void ReadFile(string filePath, List custumerNames, List phoneNumbers) { string line = string.Empty; var fileStream = new StreamReader(filePath); bool isPhoneNumber = true; while ((line = fileStream.ReadLine()) != null) { if (isPhoneNumber) { phoneNumbers.Add(Convert.ToInt32(line)); isPhoneNumber = false; } else { custumerNames.Add(line); isPhoneNumber = true; } } fileStream.Close(); } static void Main(string[] args) { Console.WriteLine("Started reading the file..."); List custumersNamesList = new List(); List custumersPhonesNumbers = new List(); ReadFile("SampleFile.txt", custumersNamesList, custumersPhonesNumbers); //Assuming both the list's has same lenght. for (int i = 0; i < custumersNamesList.Count(); i++) { Console.WriteLine(string.Format("Custumer Name: {0} , Custumer Phone Number: {1}", custumersNamesList[i], Convert.ToString(custumersPhonesNumbers[i]))); } Console.ReadLine(); } } }