others - C#使用LINQ从列表中的每一行中获取第n个单词

我有一个单词字符串的列表。


List<string> myList = new List<string>();


myList.Add("Robert is a bank manager"); 


myList.Add("Alice is a cashier"); 


myList.Add("Andrew is bank customer"); 



现在对于myList中的每个字符串行,我想得到第n个单词。我想从每个字符串中检索偶数位置的单词,我希望输出为:


var[] output = {"is","bank","is","cashier","is","customer"};



我可以简单地使用for循环并将每个第n个单词存储在输出数组中,但是很好奇如何使用linq执行相同的操作。

时间:

在LINQ中的一种方法如下:


var res = myList.Select(x => x.Split()


 .Where((_,i) => (i + 1) % 2 == 0))


 .SelectMany(x => x);



这创建了一个通过索引过滤的单词列表,然后用SelectMany将列表的List平滑为List 。

可以通过使用SelectMany简化这个,以下代码:


var res = myList.SelectMany(x => x.Split().Where((_, i) => (i + 1) % 2 == 0));




var n = 2;


myList.Select(s => s.Split().Where((t, i) => (i - 1) % n == 0))



这使用Where的重载,其中包含索引作为参数。 请注意,这不是很健壮,没有经过严格测试。

下面是我实现它的方法:


public static IEnumerable<string> GetEveryNthWord(string input, int n)


{


 return input.Split().Where((value, index) => (index + 1) % n == 0);


}



public static IEnumerable<string> GetEveryNthWord(IEnumerable<string> input, int n)


{


 return input.SelectMany(sentence => GetEveryNthWord(sentence, n));


}



使用:


private static void Main()


{


 var myList = new List<string>


 {


"Robert is a bank manager",


"Alice is a cashier",


"Andrew is bank customer"


 };



 var result = GetEveryNthWord(myList, 2).ToList();



 /* result


 Count = 6


 [0]:"is"


 [1]:"bank"


 [2]:"is"


 [3]:"cashier"


 [4]:"is"


 [5]:"customer"


 */


}



...