我想删除其列包含?
的数据的所有行,例如在大约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;
答案 0 :(得分:0)
您忘记反转包含的内容:
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。如果没有,则说明编码有问题。
答案 1 :(得分:0)
您写道:
我要删除其列包含“?”的数据的所有行
您永远无法使用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));