Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# LINQ让重复数据_C#_Linq - Fatal编程技术网

C# LINQ让重复数据

C# LINQ让重复数据,c#,linq,C#,Linq,我对LINQ的一个简单示例有一个问题。我没有收到预期的结果。代码如下: string[] postres = { "pay de manzana", "pastel de chocolate", "manzana caramelizada", "fresas con crema", "pay de manzana y pera" }; IEnumerable<string> mispays = from p in postres

我对LINQ的一个简单示例有一个问题。我没有收到预期的结果。代码如下:

        string[] postres = { "pay de manzana", "pastel de chocolate", "manzana caramelizada", "fresas con crema", "pay de manzana y pera" };

        IEnumerable<string> mispays = from p in postres
                                      let manzanitas = (
                                        from p1 in postres
                                        where p1.Contains("manzana")
                                        orderby p1
                                        select p1)
                                      from p2 in manzanitas
                                      where p2.Contains("pay")
                                      select p2;

        foreach (string postre in mispays)
        {
            Console.WriteLine(postre);
        }
string[]postres={“曼扎纳的薪酬”、“巧克力的粉彩”、“曼扎纳卡拉梅利扎达”、“fresas con crema”、“曼扎纳的薪酬与佩拉”};
IEnumerable mispays=从postres中的p开始
让manzanitas=(
来自postres中的p1
其中p1.包含(“manzana”)
订购人p1
选择p1)
来自曼萨尼塔的p2
其中p2.包含(“支付”)
选择p2;
foreach(错放中的字符串postre)
{
控制台写入线(postre);
}
我期望这一结果:

曼扎纳薪酬 支付manzana和pera的费用

但我收到的是:

曼扎纳薪酬 支付manzana和pera的费用 曼扎纳薪酬 支付manzana和pera的费用 曼扎纳薪酬 支付manzana和pera的费用 曼扎纳薪酬 支付manzana和pera的费用 曼扎纳薪酬 支付manzana和pera的费用

所以代码重复了我预期结果的5倍。 你能告诉我为什么吗?我怎样才能得到预期的结果


谢谢你的帮助。

你似乎经历了太多次
postres
,结果是预期结果的5倍。这可能是由于开始时postres中p的
未使用,导致查询的其余部分比预期运行了5倍(长度
postres
)。您只需要通过
postres
一次

我会将您的查询简化为:

IEnumerable<string> mispays = from p in postres
                              where p.Contains("manzana") && p.Contains("pay")
                              select p;

Console.WriteLine("{ " + string.Join(", ", mispays) + " }");
// { pay de manzana, pay de manzana y pera }
说明:

  • 首先使用or子句筛选出数组
    postres
  • 然后使用以下命令指定内部谓词,使其仅包含包含
    “manzana”
    “pay”
    以外的字符串

    • 这是另一个版本

      string[] postres = { "pay de manzana", "pastel de chocolate", "manzana caramelizada", "fresas con crema", "pay de manzana y pera" };
      
      var keyWords = new string[] {"manzana", "pay"};
      
      var found = postres
          .Where( p => keyWords.All( w => p.Contains(w)))
          .ToList();
      
      foreach (var o in found) Console.WriteLine(o);
      

      更新以下评论

      你知道用“让”这个词怎么做吗


      这里的问题是因为查询中的第一行:

      from p in postres
      
      这意味着要迭代整个循环,因此需要五个结果。你没有太多的改变:

      IEnumerable<string> mispays = from p2 in (
                                              from p1 in postres
                                              where p1.Contains("manzana")
                                              orderby p1
                                              select p1)
                                    where p2.Contains("pay")
                                    select p2;
      
      IEnumerable mispays=从p2开始(
      来自postres中的p1
      其中p1.包含(“manzana”)
      订购人p1
      选择p1)
      其中p2.包含(“支付”)
      选择p2;
      

      查询语法可能非常棘手。方法语法通常更容易理解,如其他答案所示。

      为什么postres中p的第一行
      ,因为您似乎不使用它?很好,我没有想到这种方法。如果要搜索的字数增加,这可能更具可扩展性。非常感谢您的回答。你知道用“让”这个词怎么做吗?非常感谢你的回答。你知道用“让”这个词怎么做吗?非常感谢你的回答。你知道用“让”这个词怎么做吗?
      
      var found =
          from p in postres
          let keyWords = new string[] {"manzana", "pay"}
          let sentence = p.ToLower()
          where keyWords.All( w => sentence.Contains(w.ToLower()))
          select p;
          // ToLower()s are obviously optional, but it gives you an extra let ;)
      
      from p in postres
      
      IEnumerable<string> mispays = from p2 in (
                                              from p1 in postres
                                              where p1.Contains("manzana")
                                              orderby p1
                                              select p1)
                                    where p2.Contains("pay")
                                    select p2;