Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# 将For循环转换为LINQ导致的错误_C#_Linq - Fatal编程技术网

C# 将For循环转换为LINQ导致的错误

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循环代码转换为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 == 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();