将循环更改为Linq C#
我在C#中的一个函数要求我过滤一些值。因此,我在其中使用了很多循环来尝试它。它可以工作,但看起来效率不高。你知道如何将下面的代码转换成LinQ吗 感谢您的帮助将循环更改为Linq C#,c#,linq,C#,Linq,我在C#中的一个函数要求我过滤一些值。因此,我在其中使用了很多循环来尝试它。它可以工作,但看起来效率不高。你知道如何将下面的代码转换成LinQ吗 感谢您的帮助 var object1 = JsonConvert.DeserializeObject<List<string>>(object1json); foreach (var item1 in table1) { if (item1.Code == Inpu
var object1 = JsonConvert.DeserializeObject<List<string>>(object1json);
foreach (var item1 in table1)
{
if (item1.Code == InputCode)
{
for (int i = 0; i < object1.Count(); i++)
{
tempData temp = new tempData();
foreach (var item2 in item1.List)
{
if (item2.Code == object1[i])
{
temp.Code = item2.Code;
temp.Description = item2.Description;
}
}
if(temp.Code != null || temp.Description != null)
final.Add(temp);
}
}
}
var object1=JsonConvert.DeserializeObject(object1json);
foreach(表1中的var项目1)
{
if(item1.Code==InputCode)
{
for(int i=0;i
如果您希望您的代码更高效,正如评论中所指出的,将其转换为Linq并没有真正的帮助。它仍然是相同的逻辑,只是用不同的方式写的。如果您想提高可读性,只需做一些更改即可:
foreach (var item1 in table1.Where(i => i.Code == InputCode))
{
foreach (var code in object)
{
// This could be SingleOrDefault, I don't know if you have duplicates in the list or not
var item2 = item1.List.LastOrDefault(i => i.Code == code);
if(item2 != null)
{
final.Add(new tempData
{
Code = item2.Code,
Description = item2.Description,
});
}
}
}
如果将整个内容转换为Linq:
var final = table1.Where(i => i.Code == InputCode)
.SelectMany(item1 => object.Select(code => item1.List.LastOrDefault(i => i.Code == code))
.Where(item2 => item2 != null)
.Select(item2 => new tempData
{
Code = item2.Code,
Description = item2.Description,
})
.ToList();
就我个人而言,我更喜欢第一个选项,因为它更容易阅读。我想你发布的是示例代码而不是实际代码,否则最好避免使用C#中的像
object
这样的关键字。反正
var final = table1.Where(item1 => item1.Code == InputCode)
.SelectMany(item1 => item1.List)
.Where(item2 => @object.Contains(item2.Code))
.Where(temp => temp.Code != null || temp.Description != null)
.Select(item2 => new tempData()
{
Code = item2.Code,
Description = item2.Description
});
此代码不会编译(
object
是一个关键字)。什么是对象
?它是什么类型的?.Count()的实现是什么
看起来像吗?我不希望将其转换为LINQ会提高效率。@OP帖子中的内部foreach
似乎正在执行逻辑JOIN
操作-如果使用基于哈希的查找,速度会快得多,具体取决于对象的大小和item1.使用hashmap列出
@Dai Yes。除非改变算法,否则LINQ将具有同等的效率。您的代码实际上不会对对象[i]
执行任何操作-这有什么意义?该死!比我快,我只是在LINQPad上打出来的。为了可读性,我会选择选项2,但我的格式也与您的不同,这样它就不会“打包”且看起来很忙。您可能可以将两个,其中调用合并为一个。@object.Contains()
比我编写的SelectMany()
表达式可读性好得多,请注意,如果item1.List中存在重复条目,则它可能与原始代码有不同的行为