我想删除列包含?
的所有数据行,例如在列状态的大约 100 行中,我得到的值为 Unknown?
、Error?
、InProgress
、Done
所以,我想删除所有包含?
的行
以下是我正在使用的代码
//I am splitting the string on the basis of delimeter ,
var data = from val in UserData
select val.Split(',');
//Below code is not working
var filterdata = from rows in data
where rows.Contains("?")
select rows;
你忘了反转包含:
string[] someStringArray = new string[]
{
""ABC" ,"Error?","OK"",
""DEF","Inprogress","FINE"",
"1,2,3",
"?,2,3",
"1,?,3",
"4,5,6"
};
//I am splitting the string on the basis of delimeter ,
var data = from val in someStringArray
select val.Split(',');
//Below code is not working
var filterdata = from rows in data
where !rows.Contains("?") // "!" to select the rows WITHOUT "?"
select rows;
foreach (var item in filterdata)
{
foreach (var i in item)
{
Console.Write(i + ",");
}
Console.WriteLine();
}
return;
结果:
"DEF","Inprogress","FINE",
4,5,6,
我认为这段代码完美地工作。
除此之外,我做了一个疯狂的猜测:你不是在搜索问题标记"?"。"?"是一个字符,如果字符无法以预期的编码显示,则通常会显示该字符。
看看你的字符有多少:
var chars = someStringArray.SelectMany(s => s.Select(c => c));
foreach (var item in chars.GroupBy(g => g.ToString() + " (" + ((int)g) + ")"))
{
Console.WriteLine(item.Key + ": " + item.Count());
}
真正的问号有63。如果没有,您会遇到编码问题。
你写道:
我想删除列包含"?">
永远不能使用 LINQ 函数更改输入序列。因此,不能使用 LINQ 从原始数据中删除行。
您可以做的是使用您的数据创建一个不包含问号的新序列。如果需要,您可以将原始数据替换为新序列。
查看您的代码,似乎UserData
是一个字符串序列,您希望这些字符串包含逗号分隔的值。
您希望将这些 CSV 字符串拆分为它们的列,但不希望任何列包含"?">
"A,?,B,C" => do not use this one, one of the column values equals "?"
"A,B,C" => use this one, none of the column values equal "?"
"A, Hello?, B" => use this one, although the second column contains a question mark
this second column is not equal to question mark
这是按如下方式完成的:
static readonly char[] separatorChars = new char[] {','}
const string questionMark = "?";
static readonly IEqualityComparer<string> comparer =
var rowsWithoutQuestionMarkValues = userData
// Split each line into column values, using comma as separator
.Select(line => line.Split(separatorChar)
// do not use the line if any of the columns equals the question mark
.Where(splitLine => !splitLine.Any(column => column == questionMark));
如果代码在问号可能看起来不同的区域性中运行,例如:"分号",请考虑使用IEqualityComparer<string>
readonly IEqualityComparer<string> comparer = GetStringComparerForMyCulture();
var result = ...
.Where(splitLine => !splitLine.Any(column => comparer.Equals(column, questionMark));