我过去几乎没用过LINQ。当我今天尝试使用LinqPad撰写一个小LINQ查询时,我收到以下错误:
Operator '==' cannot be applied to operands of type 'char' and 'string'
这是我试写的脚本:
void Main()
{
var csvlines = File.ReadAllLines(@"M:\smdr(backup08-06-2015).csv");
var csvLinesData = csvlines.Skip(1).Select(l => l.Split(',').ToArray());
var csvData = csvLinesData.Where(l => (!l[12].Contains("VM") && l[12] != "Voice Mail")).ToArray();
var user = (from r in csvData
orderby r[12]
select new User
{
CSRName = r[12],
Incomming = (from r1 in r
where r1[4] == "I"
select r1).Count(),
outgoing = (from r1 in r
where r1[4] == "O"
select r1).Count()
}).ToList();
user.Dump();
}
class User
{
public string CSRName;
public int Outgoing;
public int Incomming;
public int calltransfer;
}
根据建议,我编辑了代码
select new User
{
CSRName=r[12],
Incomming=(from r1 in r
where r1[4]=='I'
select r1).Count(),
outgoing = (from r1 in r
where r1[4] == 'O'
select r1).Count()
}).ToList();
现在它编译,但它抛出了一个不同的错误:
IndexOutOfRangeException: Index was outside the bounds of the array.
我犯错的地方?
答案 0 :(得分:7)
您正在比较字符串和字符类型
替换
where r1[4] == "I"
/ where r1[4] == "O"
带
where r1[4] == 'I'
/ where r1[4] == 'O'
答案 1 :(得分:2)
使用单引号引用' char':
Incomming = (from r1 in r
where r1[4] == 'I'
select r1).Count(),
outgoing = (from r1 in r
where r1[4] == 'O'
select r1).Count()
答案 2 :(得分:0)
我看到第一个错误已经解决(使用'
引号而不是"
来包含字符。)
关于第二次错误("编辑1"在您的问题中):从您的代码中我假设r1
是一个字符数组。
您正在阅读以逗号分隔的文本文件(" * .CSV文件"):
var csvlines = File.ReadAllLines(@"M:\smdr(backup08-06-2015).csv");
虽然列以逗号分隔,但此格式不强制您在每行中具有相同数量的列。如果已使用CR + LF终止该行,则会开始新行。
但是在源代码中,您已经假设您的r1
文件中的每一行(*.CSV
)都需要包含5个字符,但情况并非总是如此。
因此,在这些情况下,字符数组r1
的维度更短,而且您正在获取
IndexOutOfRangeException: Index was outside the bounds of the array.
如果您尝试访问r1[4]
。
为了说明这一点,我正在给出一个
示例:强>
char[] r = { 'a', 'b', 'c', 'd' };
Console.WriteLine(r[2]); // succeeds
Console.WriteLine(r[3]); // succeeds
Console.WriteLine(r[4]); // fails: allowed index range is 0..3
使用r.Length
获取数组的长度:在示例中它是4,索引从0开始,因此允许的范围是0..3。
相应地更改您的代码,例如:
where (r1!=null && r1.Length>=5) && (r1[4] == 'O')
确保它不会超出数组的范围。您可以在LinqPad中轻松测试(或将下面的代码放入控制台应用程序的Main函数中进行测试,DotNetFiddle也可以很好地运行它):
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var r = new List<char[]> { new char[]{ 'a', 'b', 'c', 'd' },
new char[]{ 'a', 'b', 'c', 'd', 'O' } };
Console.WriteLine((from r1 in r
where (r1!=null && r1.Length>=5) && r1[4] == 'O'
select r1).Count());
}
}
如果删除表达式(r1!=null && r1.Length>=5)
,则会出现您提到的错误。