假設我有var lines = IEnumerable<string>
和lines
包含多行,其前1..n個字符將它們排除在進程之外。以「*」,「例如」,「樣品」等我怎樣才能使用LINQ過濾掉以各種子字符串開頭的字符串?
排阻令牌列表E.g線是可變的並且僅在運行時已知的,所以
lines.Where(l => !l.StartsWith("*") && !l.StartsWith("E.g.") && ...
變得有點問題。
我怎麼能做到這一點?
假設我有var lines = IEnumerable<string>
和lines
包含多行,其前1..n個字符將它們排除在進程之外。以「*」,「例如」,「樣品」等我怎樣才能使用LINQ過濾掉以各種子字符串開頭的字符串?
排阻令牌列表E.g線是可變的並且僅在運行時已知的,所以
lines.Where(l => !l.StartsWith("*") && !l.StartsWith("E.g.") && ...
變得有點問題。
我怎麼能做到這一點?
使用LINQ:
List<string> exceptions = new List<string>() { "AA", "EE" };
List<string> lines = new List<string>() { "Hello", "AAHello", "BHello", "EEHello" };
var result = lines.Where(x => !exceptions.Any(e => x.StartsWith(e))).ToList();
// Returns only "Hello", "BHello"
試試這個:
List<string> lines = new List<string>(); //add some values
List<string> exclusion=new List<string>(); //add some values
var result = lines.Except(exclusion, new MyComparer());
其中:
public class MyComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y) { return x.StartsWith(y); }
public int GetHashCode(string obj) { //some code }
}
+1涉及比較器。 – 2013-04-06 13:33:38
這不保證比較imo。 無論上下文如何使用比較器都是愚蠢的。 – 2013-04-06 13:36:53
我更喜歡Blachshma的回答,但是你的答案很整齊,並且爲了教我關於'Except'的信息而獲得+1。 – ProfK 2013-04-06 13:42:05
+1差不多我會怎麼寫。 – Oded 2013-04-06 13:23:20
我知道它必須是這樣的,謝謝。 – ProfK 2013-04-06 13:38:49