In the code below,how do I declare myLine as a public(global) variable? The problem is that I can't use the keyword "var".
在下面的代码中,如何将myLine声明为公共(全局)变量?问题是我不能使用关键字“var”。
public static IEnumerable<string> ReadLines(StreamReader reader)
{
while (!reader.EndOfStream)
{
yield return reader.ReadLine();
}
}
private void Filter1(string filename)
{
using(var writer = File.CreateText(Application.StartupPath + "\\temp\\test.txt"))
{
using (var reader = File.OpenText(filename))
{
int[] Ids = { 14652, 14653, 14654, 14655, 14656, 14657, 14658, 14659, 14660 };
var myLine = from line in ReadLines(reader)
where line.Length > 1
let id = int.Parse(line.Split('\t')[1])
where Ids.Contains(id)
let m = Regex.Match(line, @"^\d+\t(\d+)\t.+?\t(item\\[^\t]+\.ddj)")
where m.Success == true
select new { Text = line, ItemId = id, Path = m.Groups[2].Value };
foreach (var id in myLine)
{
writer.WriteLine("Item Id = " + id.ItemId);
writer.WriteLine("Path = " + id.Path);
writer.WriteLine("\n");
}
}
}
}
I want to do it ,because I have to find a way to gain access to that ienumerable for later use.
我想这样做,因为我必须找到一种方法来获取对该数量的访问以供以后使用。
2 个解决方案
#1
The trouble is that it's using an anonymous type, which you can't use in a field declaration.
麻烦的是它使用的是匿名类型,你不能在字段声明中使用它。
The fix is to write a named type with the same members, and use that type in your query. If you want it to have the same behaviour as your anonymous type, it should:
修复方法是编写具有相同成员的命名类型,并在查询中使用该类型。如果您希望它与您的匿名类型具有相同的行为,它应该:
- Take all the values in the constructor
- Be immutable, exposing read-only properties
- Override
Equals
,GetHashCode
andToString
- Be sealed
获取构造函数中的所有值
是不可变的,暴露只读属性
覆盖Equals,GetHashCode和ToString
You could just use Reflector to decompile the code, but then you'd end up with a generic type which you don't really need.
你可以使用Reflector来反编译代码,但是你最终会得到一个你并不真正需要的泛型类型。
The class would look something like:
该类看起来像:
public sealed class Foo
{
private readonly string text;
private readonly int itemId;
private readonly string path;
public Foo(string text, int itemId, string path)
{
this.text = text;
this.itemId = itemId;
this.path = path;
}
public string Text
{
get { return text; }
}
public int ItemId
{
get { return itemId; }
}
public string Path
{
get { return path; }
}
public override bool Equals(object other)
{
Foo otherFoo = other as Foo;
if (otherFoo == null)
{
return false;
}
return EqualityComparer<string>.Default.Equals(text, otherFoo.text) &&
return EqualityComparer<int>.Default.Equals(itemId, otherFoo.itemId) &&
return EqualityComparer<string>.Default.Equals(path, otherFoo.path);
}
public override string ToString()
{
return string.Format("{{ Text={0}, ItemId={1}, Path={2} }}",
text, itemId, path);
}
public override int GetHashCode()
{
int hash = 17;
hash = hash * 23 + EqualityComparer<string>.Default.GetHashCode(text);
hash = hash * 23 + EqualityComparer<int>.Default.GetHashCode(itemId);
hash = hash * 23 + EqualityComparer<string>.Default.GetHashCode(path);
return hash;
}
}
Your query would just change at the end to:
您的查询最终会更改为:
select new Foo(line, id, m.Groups[2].Value)
#2
Instead of using an anonymous class with the new keyboard, define a class explicitly with a Text, ItemId, etc. Then the type would be IQueryable<MyClass>. Use that instead of the var keyword.
不使用带有新键盘的匿名类,而是使用Text,ItemId等显式定义类。然后类型将是IQueryable
#1
The trouble is that it's using an anonymous type, which you can't use in a field declaration.
麻烦的是它使用的是匿名类型,你不能在字段声明中使用它。
The fix is to write a named type with the same members, and use that type in your query. If you want it to have the same behaviour as your anonymous type, it should:
修复方法是编写具有相同成员的命名类型,并在查询中使用该类型。如果您希望它与您的匿名类型具有相同的行为,它应该:
- Take all the values in the constructor
- Be immutable, exposing read-only properties
- Override
Equals
,GetHashCode
andToString
- Be sealed
获取构造函数中的所有值
是不可变的,暴露只读属性
覆盖Equals,GetHashCode和ToString
You could just use Reflector to decompile the code, but then you'd end up with a generic type which you don't really need.
你可以使用Reflector来反编译代码,但是你最终会得到一个你并不真正需要的泛型类型。
The class would look something like:
该类看起来像:
public sealed class Foo
{
private readonly string text;
private readonly int itemId;
private readonly string path;
public Foo(string text, int itemId, string path)
{
this.text = text;
this.itemId = itemId;
this.path = path;
}
public string Text
{
get { return text; }
}
public int ItemId
{
get { return itemId; }
}
public string Path
{
get { return path; }
}
public override bool Equals(object other)
{
Foo otherFoo = other as Foo;
if (otherFoo == null)
{
return false;
}
return EqualityComparer<string>.Default.Equals(text, otherFoo.text) &&
return EqualityComparer<int>.Default.Equals(itemId, otherFoo.itemId) &&
return EqualityComparer<string>.Default.Equals(path, otherFoo.path);
}
public override string ToString()
{
return string.Format("{{ Text={0}, ItemId={1}, Path={2} }}",
text, itemId, path);
}
public override int GetHashCode()
{
int hash = 17;
hash = hash * 23 + EqualityComparer<string>.Default.GetHashCode(text);
hash = hash * 23 + EqualityComparer<int>.Default.GetHashCode(itemId);
hash = hash * 23 + EqualityComparer<string>.Default.GetHashCode(path);
return hash;
}
}
Your query would just change at the end to:
您的查询最终会更改为:
select new Foo(line, id, m.Groups[2].Value)
#2
Instead of using an anonymous class with the new keyboard, define a class explicitly with a Text, ItemId, etc. Then the type would be IQueryable<MyClass>. Use that instead of the var keyword.
不使用带有新键盘的匿名类,而是使用Text,ItemId等显式定义类。然后类型将是IQueryable