说我有一个字符串列表
1,2,3,a,b,a,b,c,1,2
我有第二个字符串列表
a,b,c
我想删除第一个产生的第二个列表
1,2,3,a,b,1,2
使用两个List<string>
执行此操作的最佳方法是什么?
我看到的大多数方法/问题/答案涉及列表都围绕着从第一个列表中删除的第二个列表的各个行(所有的...所有b ...所有c ...)。
我不希望这样......我只想删除a后跟b后跟c。
的那些编辑:
一些警告:第二个列表通常是两个或三个字符串,并且CAN多次出现(相反,第二个列表是1,2
。它包含在第一个列表中两次)。
答案 0 :(得分:2)
var list = new List<string>(new[] { "1", "2", "3", "a", "b", "a", "b", "c", "1", "2" });
var sublist = new List<string>(new[] { "a", "b", "c" });
var start = -1;
var index = 0;
while (index < list.Count - sublist.Count)
{
for (int i = 0; i < sublist.Count; i++)
{
if (list[i + index] == sublist[i] && i == 0)
{
start = i + index;
}
else if (list[i + index] != sublist[i])
{
start = -1;
index++;
break;
}
}
if (start != -1)
{
list.RemoveRange(start, sublist.Count);
index -= sublist.Count;
}
}
foreach (var item in list)
{
Console.Write(item + ",");
}
答案 1 :(得分:1)
黑客攻击:
var list = new List<string>(new[] { "1", "2", "3", "a", "b", "a", "b", "c", "1", "2" });
var sublist = new List<string>(new[] { "a", "b", "c" });
var a = string.Join("#", list);
var b = string.Join("#", sublist);
var result =
new List<string>(a.Replace(b, string.Empty).Split(new[] { '#' }, StringSplitOptions.RemoveEmptyEntries));
foreach (var item in result)
{
Console.Write(item + ",");
}
此解决方案的性能非常糟糕,但它可以用于小型列表。
答案 2 :(得分:1)
使用这几行你可以达到同样的效果。首先将其转换为String,然后用第二个字符串替换并将其转换回char数组。
List<string> listA = new List<string>() { "1", "2", "3", "a", "b", "a", "b", "c", "1", "2" };
List<string> listB = new List<string>() { "a", "b", "c" };
string strA = string.Join("", listA);
string strB = string.Join("", listB);
strA = strA.Replace(strB, string.Empty);
List<string> resultList = strA.ToCharArray().Select(c => c.ToString()).ToList();
如果您需要支持完整的成熟字符串,请在代码下面
List<string> listA = new List<string>() { "abc1", "2abc2", "3", "a", "b", "a", "b", "c", "1", "2" };
List<string> listB = new List<string>() { "a", "b", "c" };
string strA = string.Join(",", listA);
string strB = string.Join(",", listB) ;
strA = strA.Replace(strB, string.Empty).Replace(",,", ",");
List<string> resultList = strA.Split(',').ToList();
答案 3 :(得分:1)
如果符合您的预期,则删除多个匹配项。我对实施并不感到兴奋,但似乎有效。我使用了一个堆栈(最后一个),因为我懒惰。
List<string> target = new List<string> { "1", "2", "3", "a", "b", "a", "b", "c", "1", "2", "a", "b", "c", "1" };
List<string> match = new List<string> { "a", "b", "c" };
Stack<int> matchIndexes = new Stack<int>();
for (int x = 0; x < target.Count - match.Count; x++)
{
int matches = 0;
for (int y = 0; y < match.Count; y++)
{
if (target[x + y] != match[y])
{
break;
}
else
{
matches++;
}
}
if (matches == match.Count)
{
matchIndexes.Push(x);
}
}
while(matchIndexes.Count > 0)
{
int index = matchIndexes.Pop();
target.RemoveRange(index, match.Count);
}
答案 4 :(得分:-3)
只需遍历列表2中的每个项目,然后将其从列表1中删除。
foreach(string listItem in list2)
{
list1.Remove(listItem);
}