将LINQ中的IEnumerable数据作为参数传递给方法

Aad*_*mia 8 c# linq

可能重复:
如何将匿名类型传递给方法?

我有以下LINQ语句,其输出必须在另一种方法中处理:

var data = from lines in File.ReadAllLines(TrainingDataFile)
                             .Skip(ContainsHeader ? 1 : 0)
           let f = lines.Split(new[] { FieldSeparator }).ToList<String>()
           let target = f[TargetVariablePositionZeroBased]
           select new { F=f, T=target };
Run Code Online (Sandbox Code Playgroud)

采用此数据的方法中参数的数据类型应该是什么?

Adi*_*dil 8

您无法从方法返回匿名数据类型.您可以从查询中定义一个类并返回该类的对象,并将其传递给target方法.

public class SomeClass
{
    public string F {get; set;}
    public string T {get; set;}
}

var data = from lines in File.ReadAllLines(TrainingDataFile)
                                .Skip(ContainsHeader ? 1 : 0)
               let f = lines.Split(new[] { FieldSeparator }).ToList<String>()
               let target = f[TargetVariablePositionZeroBased]
               select new SomeClass { F=f, T=target };
Run Code Online (Sandbox Code Playgroud)

您可以将查询结果IEnumerable<SomeClass>作为参数传递给方法.

public void MethodToCall(IEnumerable<SomeClass> someClass)
{

}
Run Code Online (Sandbox Code Playgroud)

通过传递IEnumerable<SomeClass>存储data在此示例代码中的查询结果()来调用该方法

MethodToCall(data);
Run Code Online (Sandbox Code Playgroud)

  • "你不能从方法中返回匿名数据类型." - 没错,但这不是问题所在.该问题要求*将*匿名数据类型*传递给*方法.当该方法是通用方法时,这是可能的.(泛型方法在这里是否有用取决于该方法应该做什么.) (5认同)

mel*_*okb 3

您不能很容易地传递匿名类型。您可以创建一个类,或者由于您的数据只有两个属性,因此使用Tuple

select new Tuple<List<string>, string> (f, target);
Run Code Online (Sandbox Code Playgroud)

如果我的数据类型正确,那么参数的数据类型将是:

IEnumerable<Tuple<List<string>, string>>
Run Code Online (Sandbox Code Playgroud)

您将引用FT使用Tuple属性Item1Item2

  • @Aadith 对于类似的示例,请考虑标准类型“Dictionary&lt;TKey, TValue&gt;”,它实现“IEnumerable&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;”。这是完全有效的:“IEnumerable”有一个泛型类型参数,即“KeyValuePair&lt;TKey, TValue&gt;”。 (2认同)