Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用linq从列表中的每行中获取第n个单词_C#_List_Linq - Fatal编程技术网

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?