C# LINQ让重复数据
我对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
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;