我仍在学习C#的基础知识,并发现了一个任务,您必须实现下面的方法,它应该返回相同的字符串序列,但大写,我认为序列意味着数组。
但我也应该以某种方式使用IEnumerable。
我认为IEnumerable是一个接口,在我应该添加逻辑的方法中,它是一个类型和参数吗?
我搜索发现返回类型IEnumerable意味着它必须返回一些可以实现IEnumeraable的东西,但参数仍然让我困惑,我如何使用它们来返回大写字母?我要使用foreach
吗?
using System;
using System.Collections.Generic;
namespace EnumerableTask
{
public class EnumerableManipulation
{
/// <summary> Transforms all strings to upper case.</summary>
/// <param name="data">Source string sequence.</param>
public IEnumerable<string> GetUppercaseStrings(IEnumerable<string> data)
{
}
}
您可以使用Linq Select((,它将返回一个IEnumerable。即:
public IEnumerable<string> GetUppercaseStrings(IEnumerable<string> data)
{
return data.Select(d => d.ToUpper());
}
编辑:你可以查看Linq文档或我的博客,从最古老的帖子(2009年2月(开始:
FoxSharp
您也可以使用foreach
和yield
:
public IEnumerable<string> GetUppercaseStrings(IEnumerable<string> data)
{
foreach (var item in data)
yield return item?.ToUpper();
}
IEnumerable<T>
是一个通用接口。它表示类型为T
的对象的集合。在您的案例中,data
是可以枚举的string
的集合。
枚举IEnumerable
要枚举"数据"并逐个访问元素,有几种可能性。这里有两个例子。
GetEnumerator((
GetEnumerator()
为您提供了一种通过IEnumerable<T>
进行枚举的方法。enumerator.Current
允许您访问当前元素,enumerator.MoveNext()
允许您移动到集合中的下一个元素
首先使用调用MoveNext()
方法将枚举器放置在IEnumerable<T>
的第一个元素处。当仍有元素要枚举时,MoveNext()
将返回true
。当到达终点时,MoveNext()
返回false
以下是它的典型使用示例。
IEnumerator<string> enumerator = data.GetEnumerator();
while(enumerator.MoveNext())
{
string text = data.Current;
/* Do something */
}
enumerator.Dispose();
前臂
使用foreach
可以处理枚举器过程的所有复杂性。事实上,建议使用foreach
,而不是直接操作枚举器(请参阅备注中的Microsoft文档(。
foreach(string text in data)
{
/* Do something */
}
返回IEnumerable
因为IEnumerable<T>
是一个接口,所以不能"构造";就像使用class
或struct
一样。因此,要返回IEnumerable<T>
,您必须安装一个实际的class
或实现该接口的struct
。例如:
public IEnumerable<string> Foo()
{
List<string> list = new List<string>();
/* Do something on the list*/
return list;
}
或
public IEnumerable<string> Foo(int count)
{
string[] array = new string[count];
/* Do something on the array*/
return array;
}
可以这样做是因为List<T>
和Array
实现了接口IEnumerable<string>
。