あなたはかなり近くにいて、String.StartsWith
それをうまく処理します:
// nb: if you are case SENSITIVE remove the second argument to ll.StartsWith
File.WriteAllLines(
path,
File.ReadAllLines(path)
.Where(ll => ll.StartsWith(user, StringComparison.OrdinalIgnoreCase)));
代わりに、パフォーマンスが良くない可能性のある非常に大きなファイルの場合:
// Write our new data to a temp file and read the old file On The Fly
var temp = Path.GetTempFileName();
try
{
File.WriteAllLines(
temp,
File.ReadLines(path)
.Where(
ll => ll.StartsWith(user, StringComparison.OrdinalIgnoreCase)));
File.Copy(temp, path, true);
}
finally
{
File.Delete(temp);
}
指摘された別の問題は、ユーザーが次の場合、IndexOf
とは一致としてStartsWith
扱いABC
、一致するものとして扱うことでした。ABCDEF
ABC
var matcher = new Regex(
@"^" + Regex.Escape(user) + @"\b", // <-- matches the first "word"
RegexOptions.CaseInsensitive);
File.WriteAllLines(
path,
File.ReadAllLines(path)
.Where(ll => matcher.IsMatch(ll)));