选择数组的备用项C#
我有一个数组statsname为
apple X banana Y Kiwi z
我需要把苹果,香蕉和猕猴桃放在一个数组Fruit和X,Y和Z中,这个数组叫做alphabets。
有什么简单的C#机制吗?
使用提供索引的IEnumerable
重载。
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(); } } }