我遇到了一些LINQ语法的问题,我相信我在这里缺少一些非常简单的东西。
我有一个基本类定义为:
public class ParseData
{
public int Offset { get; set; }
public int Length { get; set; }
public string AssociatedCode { get; set; }
}
我有一些将要处理的类项目的集合:
public ObservableCollection<ParseData> OffsetList { get; set; }
我有一个查询此集合的方法,以查看是否有任何符合特定条件的条目,以及是否有任何do,将以不同方式处理涉及的项目。
这是我正在使用的语法(在while循环中首先使用LINQ语法):
private void ParseText()
{
//Prep code for while loop
while (currentSpacePosition != -1)
{
var possibleOffset = OffsetList.Where(offset => offset.Offset.Equals(currentCursorPosition)).ToList<ParseData>();
nextCursorPosition = currentSpacePosition + 1;
currentTextBlock = Text.Substring(currentCursorPosition,(currentSpacePosition - currentCursorPosition) + 1);
if (possibleOffset.Count != 0)
{
//Process one way;
AddHyperlinkButton(currentTextBlock);
}
else
{
//Process another way.
AddTextBlock(currentTextBlock);
}
currentCursorPosition = nextCursorPosition;
currentSpacePosition = Text.IndexOf(' ', currentCursorPosition);
}
//More processing
}
我在这里缺少什么? poosibleOffset变量保持返回一个空列表,但是如果我单步调试代码,OffsetList中有一个项目包含一个符合我的选择标准的偏移prerty,这表明我的语法在尝试时不正确检查值。
如果您需要更多有关流程的代码或信息,我们很乐意提供。
提前致谢。
干杯,
史蒂夫
答案 0 :(得分:1)
你真正使用Linq并没有错:
public class ParseData
{
public int Offset { get; set; }
}
public ObservableCollection<ParseData> OffsetList { get; set; }
public Program()
{
OffsetList = new ObservableCollection<ParseData> { new ParseData { Offset = 5 } };
int offset = 5;
int found = OffsetList.Where(o => o.Offset.Equals(offset)).ToList().Count;
Console.WriteLine("Found: " + found);
}
输出:
Found: 1
答案 1 :(得分:0)
我相信你正在遇到“访问修改后的关闭”问题。您需要在Where子句之前将currentSpacePosition复制到本地临时变量中,然后在where条件中使用它。
答案 2 :(得分:0)
您能否告诉我 currentCursorPosition 变量的类型是什么? 例如,如果它是long类型,编译器将选择使用Int32的Equals(object)重载,在这种情况下,即使变量在数学上与Offset属性中的值相等,它也会返回false。
答案 3 :(得分:0)
女士们,先生们,请允许我为浪费宝贵的时间而道歉。然而,我是一个大笨蛋。在调试一些问题的过程中,我注释掉了初始化属性OffsetList的代码,这是我搜索条件中的关键元素。如果我之前注意到这一点,那么LINQ查询将首次出现在门外。
感谢所有试图拯救我自己愚蠢的人。我会暂时提出这个问题,这样你就可以指出并大笑,然后我会关闭。