C#List - 从另一个列表中删除列表

时间:2016-07-05 03:54:39

标签: c# list dictionary replace

说我有一个字符串列表

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。它包含在第一个列表中两次)。

5 个答案:

答案 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);
}