1

我有一个数组 statsname 作为

apple
X
banana
Y
Kiwi
z

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

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

4

9 回答 9

10

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

var fruits = statsname.Where((s, i) => i % 2 == 0).ToArray();
var alphabets = statsname.Where((s, i) => i % 2 != 0).ToArray();
于 2013-11-22T09:29:30.947 回答
8

从如何在 C# 中使用 Enumerable 获取备用元素中被盗

var fruits = myArray.Where((t, i) => i % 2 == 0).ToArray();
var alphabets = myArray.Where((t, i) => i % 2 == 1).ToArray();
于 2013-11-22T09:29:25.087 回答
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];
于 2013-11-22T09:29:04.683 回答
2

单 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结果

于 2013-11-22T09:35:41.937 回答
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在列表上做

于 2013-11-22T09:30:59.137 回答
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]; 
   }   
}
于 2013-11-22T09:41:20.093 回答
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];
 }
于 2013-11-22T09:42:07.767 回答
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,请参阅迭代器(C# 编程指南)。这是该语言非常强大的特性。你可以:

于 2013-11-22T10:04:12.123 回答
-2

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

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<string> custumerNames, List<int> 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<string> custumersNamesList = new List<string>();
            List<int> custumersPhonesNumbers = new List<int>();

            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();
        }
    }
}
于 2016-06-08T13:18:24.707 回答