如果專案包含另一個串列中的字串,我正在尋找從一個串列中洗掉專案的最有效方法。
例如:
B 串列包含:
TomWentFishing
SueStayedHome
JohnGoesToSchool
JimPlaysTennis
一個串列包含:
GoesToSchool
SueStayed
C 串列應包含:
TomWentFishing
JimPlaysTennis
我已經使用了這段代碼,但是由于串列非常大,它會占用很多時間:
static void Main(string[] args)
{
string[] b = File.ReadAllLines(@"C:\b.txt");
string[] a = File.ReadAllLines(@"C:\a.txt");
foreach (string firststring in b)
{
bool contains = false;
foreach (string secondstring in a)
{
if (firststring.ToLower().Contains(secondstring.ToLower()))
{
contains = true;
break;
}
}
if (contains == false)
{
File.AppendAllText(@"C:\c.txt", firststring Environment.NewLine);
}
}
}
uj5u.com熱心網友回復:
如果您可以將串列排序為可以支持二進制(或更快)查找的內容,則可以顯著加快速度。a
不幸的是,Contains()搜索使這具有挑戰性。但是我們仍然可以做一些事情:
- 避免將所有內容加載
b到 RAM 中。曾經。 - 另一方面,如果我們一次
a預加載到 RAM 中,查找速度會更快,并盡可能多地支持對這個副本的查找。 - 只轉換
b為小寫一次,而不是對a. - 一次完成所有的寫操作會更有效率,而不是重新打開輸出檔案來追加我們找到的行。
- 作為獎勵,我們將以更少的代碼完成所有這些作業。
static void Main(string[] args)
{
var b = File.ReadLines(@"C:\b.txt");
var a = File.ReadLines(@"C:\a.txt").Select(line => line.ToLower()).ToList();
var result = b.Where(bline => {
var lowered = bline.ToLower();
return !a.Any(aline => lowered.Contains(aline));
});
File.AppendAllLines(@"C:\c.txt", result);
}
uj5u.com熱心網友回復:
如果問題是由于檔案大小而導致記憶體使用率高,那么您已經讀取了一個檔案,但對于另一個檔案而不是直接讀取記憶體中的整個檔案,您可以使用 FileInputStream 和 BufferedReader 逐行讀取。這將減少一些記憶體使用
uj5u.com熱心網友回復:
根據任務的復雜性和規模,有時使用NuGet制作
這只是另一種選擇。
uj5u.com熱心網友回復:
在這里,您有一個非常有效的基于哈希集的實作,它是線性時間復雜度 O(n)。這避免了您為 b.txt 檔案中的每一行迭代 a.txt 檔案的所有行,這會導致二次時間復雜度 O(n^2)。
如果包含所有 a.txt 檔案行的哈希集適合記憶體,則此方法很好。如果它不適合記憶體,那么您需要使用 RocksDb 之類的東西。
首先你有這個擴展方法:
public static class EnumerableStringExtensions
{
public static IEnumerable<string> Minus(
this IEnumerable<string> minuend,
IEnumerable<string> subtrahend,
StringComparison comparisonType)
{
var subtrahendSet = new HashSet<string>(subtrahend, StringComparer.FromComparison(comparisonType));
return minuend.Where(x => subtrahendSet.Contains(x) == false);
}
}
你可以像這樣使用它:
public class Program
{
public static IEnumerable<string> EnumerateLines(string filePath)
{
using (var reader = File.OpenText(filePath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
static void Main(string[] args)
{
var minuend = EnumerateLines("b.txt");
var sustraend = EnumerateLines("a.txt");
var difference = minuend.Minus(sustraend, StringComparison.OrdinalIgnoreCase);
File.WriteAllLines("difference.txt", difference);
}
}
請注意,使用此實作,您不需要一次將 b.txt 檔案中的所有行保存在記憶體中。但是您需要一個包含 a.txt 中所有行的哈希集
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481105.html
上一篇:從父類python覆寫“常量”
