C# 将For循环转换为LINQ导致的错误
我想将下面的for循环代码转换为LINQ以提高可读性。for循环工作正常。然而,林克给了我错误,有人能指出我在哪里犯了错误吗C# 将For循环转换为LINQ导致的错误,c#,linq,C#,Linq,我想将下面的for循环代码转换为LINQ以提高可读性。for循环工作正常。然而,林克给了我错误,有人能指出我在哪里犯了错误吗 for (int i = 1; i <= dataset.Count(); i++) { string source = dataset.First(e => e.ID == i).SourceMachine.Trim(); string target = dataset.First(e => e.ID =
for (int i = 1; i <= dataset.Count(); i++)
{
string source = dataset.First(e => e.ID == i).SourceMachine.Trim();
string target = dataset.First(e => e.ID == i).TargetMachine.Trim();
int count = dataset.First(e => e.ID == i).Connection;
GraphEdge edge = new GraphEdge(source, target, count);
edgeList.Add(edge);
}
供参考:
IQueryable dataset=builder.GetAllSeedTest();
公共部分类种子测试
{
公共字符串源计算机{get;set;}
公共字符串TargetMachine{get;set;}
公共int连接{get;set;}
公共int ID{get;set;}
}
更新GraphEdge类
public class GraphEdge : IEdge<string>
{
public GraphEdge(string s, string t, int w)
{
Source = s;
Target = t;
Weight = w;
}
public string Source { get; set; }
public string Target { get; set; }
public int Weight { get; set; }
}
公共类图形边缘:IEdge
{
公共图形边缘(字符串s、字符串t、整数w)
{
来源=s;
目标=t;
重量=w;
}
公共字符串源{get;set;}
公共字符串目标{get;set;}
公共整数权重{get;set;}
}
你所做的不是Linq。您正在初始化类中的变量,请尝试以下操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
GraphEdge graphEdge = new GraphEdge();
var edges = graphEdge.dataset.Select(e => new GraphEdge()
{
Source = e.SourceMachine.Trim(),
Target = e.TargetMachine.Trim(),
Weight = e.Connection
}).ToList();
}
}
public class GraphEdge
{
public string Source { get; set; }
public string Target { get; set; }
public int Weight { get; set; }
public IQueryable<SeedTest> dataset = builder.GetAllSeedTest();
public GraphEdge()
{
}
public GraphEdge(string s, string t, int w)
{
Source = s;
Target = t;
Weight = w;
}
public partial class SeedTest
{
public string SourceMachine { get; set; }
public string TargetMachine { get; set; }
public int Connection { get; set; }
public int ID { get; set; }
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
GraphEdge GraphEdge=新GraphEdge();
var edges=graphEdge.dataset.Select(e=>newgraphedge()
{
Source=e.SourceMachine.Trim(),
Target=e.TargetMachine.Trim(),
重量=e.连接
}).ToList();
}
}
公共类图形边缘
{
公共字符串源{get;set;}
公共字符串目标{get;set;}
公共整数权重{get;set;}
public IQueryable dataset=builder.GetAllSeedTest();
公共关系()
{
}
公共图形边缘(字符串s、字符串t、整数w)
{
来源=s;
目标=t;
重量=w;
}
公共部分类种子测试
{
公共字符串源计算机{get;set;}
公共字符串TargetMachine{get;set;}
公共int连接{get;set;}
公共int ID{get;set;}
}
}
}
虽然在这里使用linq似乎并不有利,但如果您愿意,您仍然可以尝试:
var edges = dataset.Select(t =>
{
var obj = dataset.First(m => dataset.IndexOf(t).Equals(t.ID));
return new GraphEdge(obj.SourceMachine.Trim(), obj.TargetMachine.Trim(), obj.Connection);
}).ToArray();
希望有帮助。Graphidge没有默认构造函数(没有参数的构造函数)。我怀疑这会很好:
var edges = dataset.Select(e => new GraphEdge(
e.SourceMachine.Trim(),
e.TargetMachine.Trim(),
e.Connection)).ToList();
错误是什么?Linq是一个
foreach
重放,而不是一个替换,您知道这些差异吗?@ScottChamberlain肯定会有一些性能差异。另一个是关于访问索引。我只是想看看如果我使用LINQ将新对象添加到边缘列表中,语法会是什么样子。我看到的唯一显著区别是LINQ结果的顺序可能不同,当然假设GraphEdge类的3个参数是Source、Target和Weight,设置属性也会有相同的效果。否则,只需在您的选择中调用new GraphEdge(SourceMachine.Trim(),e.TargetMachine.Trim(),e.Connection)
。我看不到您的解决方案和我的代码片段之间有任何区别。两者都不起作用,有很多不同之处。至少我的没有给出编译器错误。GrapheEdge似乎是一个类,而您发布的代码并未显示这一点。我尽了最大努力在代码中创建缺少的对象。最重要的错误是调用Graphidge构造函数的方式。。未定义Source、target和Weight,并使用{get;set;}将它们公开,以使它们具有可见性。
var edges = dataset.Select(t =>
{
var obj = dataset.First(m => dataset.IndexOf(t).Equals(t.ID));
return new GraphEdge(obj.SourceMachine.Trim(), obj.TargetMachine.Trim(), obj.Connection);
}).ToArray();
var edges = dataset.Select(e => new GraphEdge(
e.SourceMachine.Trim(),
e.TargetMachine.Trim(),
e.Connection)).ToList();