C# 在C中使用linq从列表中的每行中获取第n个单词
嗨,我有一个多字字符串列表C# 在C中使用linq从列表中的每行中获取第n个单词,c#,list,linq,C#,List,Linq,嗨,我有一个多字字符串列表 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"); 我可以简单地使用for循环并在输出数组中存储每个第n个字,但我想知道如何使用linq实现同样的功能 var n = 2; m
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");
我可以简单地使用for循环并在输出数组中存储每个第n个字,但我想知道如何使用linq实现同样的功能
var n = 2;
myList.Select(s => s.Split().Where((t, i) => (i - 1) % n == 0))
这使用包含索引的Where重载作为参数。注意:这不是健壮的/经过大量测试的/etc
这使用包含索引的Where重载作为参数。注意这不是健壮的/经过大量测试的/等等。在LINQ中执行此操作的一种方法如下:
var res = myList.Select(x => x.Split()
.Where((_,i) => (i + 1) % 2 == 0))
.SelectMany(x => x);
var res = myList.SelectMany(x => x.Split().Where((_, i) => (i + 1) % 2 == 0));
这将创建通过索引过滤的单词列表,然后使用标识函数上的SelectMany向下展平列表
正如@Xiaoy312在评论中指出的,您可以通过直接使用SelectMany来进一步简化此过程,结果如下:
var res = myList.Select(x => x.Split()
.Where((_,i) => (i + 1) % 2 == 0))
.SelectMany(x => x);
var res = myList.SelectMany(x => x.Split().Where((_, i) => (i + 1) % 2 == 0));
在LINQ中执行此操作的一种方法如下:
var res = myList.Select(x => x.Split()
.Where((_,i) => (i + 1) % 2 == 0))
.SelectMany(x => x);
var res = myList.SelectMany(x => x.Split().Where((_, i) => (i + 1) % 2 == 0));
这将创建通过索引过滤的单词列表,然后使用标识函数上的SelectMany向下展平列表
正如@Xiaoy312在评论中指出的,您可以通过直接使用SelectMany来进一步简化此过程,结果如下:
var res = myList.Select(x => x.Split()
.Where((_,i) => (i + 1) % 2 == 0))
.SelectMany(x => x);
var res = myList.SelectMany(x => x.Split().Where((_, i) => (i + 1) % 2 == 0));
哇,人们在这件事上很快!下面是我将如何在方法中实现它:
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"
*/
}
哇,人们在这件事上很快!下面是我将如何在方法中实现它:
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"
*/
}
我很好奇如何使用LINQ做同样的事情
给某人一条鱼,你喂他一天;教他们捕鱼,诸如此类
您需要的是对代码进行LINQ化的思维过程。这是我使用的过程
我要做的第一件事是看问题的描述,思考对序列中的每个元素所做的操作在哪里
对于myList中的每一行字符串,我想得到第n个单词
哦,有一个
下一个问题是:假设我想对序列中的单个元素执行此操作;我该怎么做?我可以写一个这样做的方法吗
这个问题似乎可以很好地分解为两个子问题:
1给定一个字符串,返回一个单词序列。
给定一个事物序列,每n个事物产生一个序列
我们知道如何做第一个:那是分裂
第二个是什么?再一次,我们有一个操作,在这个操作中,我们对序列的每个元素都做了一些事情。这一次我们正在筛选,所以似乎我们希望使用Where
正如其他人所指出的,您可以使用Where来获取索引。让我们编写一个助手方法:
public static IEnumerable<T> TakeEveryNth(
this IEnumerable<T> items,
int n,
int offset = 0) =>
items.Where((item, i) => (i - offset) % n == 0);
现在我们为您的问题找到了解决方案:
var result = sentences.EveryNthWord(2, 1).ToList();
我们完成了
当你试图提出LINQ解决方案时,你就是这样推理的:把所有的东西分解成小块,为每一块写一个方法,很好地解决一个问题。然后将它们与查询运算符组合在一起
如果我们想把这些都变成一个表达式呢?如果你已经把它拆开了,那就容易多了。只要把它们结合起来:
public static IEnumerable<string> EveryNthWord(
this string sentence,
int n,
int offset = 0) =>
sentence.Split(" ").TakeEveryNth(n, offset);
var n = 2;
var offset = 1;
var result = sentences
.SelectMany(sentence => sentence
.Split(" ")
.Where((item, i) => (i - offset) % n == 0))
.ToList();
但是坦率地说,如果你把代码分开,它会更有用,更可读。每个助手方法本身都很有用,所以请保留它们
我很好奇如何使用LINQ做同样的事情
给某人一条鱼,你喂他一天;教他们捕鱼,诸如此类
您需要的是对代码进行LINQ化的思维过程。这是我使用的过程
我要做的第一件事是看问题的描述,思考对序列中的每个元素所做的操作在哪里
对于myList中的每一行字符串,我想得到第n个单词
哦,有一个
下一个问题是:假设我想对序列中的单个元素执行此操作;我该怎么做?我可以写一个这样做的方法吗
这个问题似乎可以很好地分解为两个子问题:
1给定一个字符串,返回一个单词序列。
给定一个事物序列,每n个事物产生一个序列
我们知道如何做第一个:那是分裂
第二个是什么?再一次,我们有一个操作,在这个操作中,我们对序列的每个元素都做了一些事情。这一次我们正在筛选,所以似乎我们希望使用Where
正如其他人所指出的,您可以使用Where来获取索引。让我们编写一个助手方法:
public static IEnumerable<T> TakeEveryNth(
this IEnumerable<T> items,
int n,
int offset = 0) =>
items.Where((item, i) => (i - offset) % n == 0);
现在我们为您的问题找到了解决方案:
var result = sentences.EveryNthWord(2, 1).ToList();
我们完成了
当你试图提出LINQ解决方案时,你就是这样推理的:把所有的东西分解成小块,为每一块写一个方法,很好地解决一个问题。然后将它们与查询运算符组合在一起
如果我们想把这些都变成一个表达式呢?如果你已经把它拆开了,那就容易多了。只要把它们结合起来:
public static IEnumerable<string> EveryNthWord(
this string sentence,
int n,
int offset = 0) =>
sentence.Split(" ").TakeEveryNth(n, offset);
var n = 2;
var offset = 1;
var result = sentences
.SelectMany(sentence => sentence
.Split(" ")
.Where((item, i) => (i - offset) % n == 0))
.ToList();
但是坦率地说,如果你把代码分开,它会更有用,更可读。
每个助手方法本身都很有用,所以请保留它们 竖起拇指点击SelectMany你可以减少。Selectselector.SelectManyx=>x点击SelectMany你可以减少。Selectselector.SelectManyx=>x点击SelectMany你可以减少。Selectselector.SelectManyx=>x点击SelectMany你可以减少。热爱思考过程!这是否返回不可打印的字符,如\r或\n?关于解决方案的解释非常好。喜欢思考过程!是否返回不可打印的字符,如\r或\n?