C# 将所有匹配项从一个列表复制到另一个列表

C# 将所有匹配项从一个列表复制到另一个列表,c#,C#,考虑以下代码 List<string> one = new List<string>(); List<string> two = new List<string>(); 如何匹配字符串测试1,并将每个匹配字符串放入列表2中,然后从列表1中删除匹配字符串,以便只剩下测试2字符串 这就是我目前所拥有的 if (one.Any(str => str.Contains("Test 1"))) { //What to do here } 如

考虑以下代码

List<string> one = new List<string>();
List<string> two = new List<string>();
如何匹配字符串
测试1
,并将每个匹配字符串放入
列表2中
,然后从列表1中删除匹配字符串,以便只剩下
测试2
字符串

这就是我目前所拥有的

if (one.Any(str => str.Contains("Test 1")))
{
   //What to do here 
}

如果我使用
AddRange()
它会将整个列表一添加到列表二

该任务也可以用Linq解决,如下所示

var NewOne = one.Where(iString => iString == "Test1")
var NewTwo = one.Except(NewOne);

one = NewOne.ToList();
two = NewTwo.ToList();

这个任务也可以用Linq解决,如下所示

var NewOne = one.Where(iString => iString == "Test1")
var NewTwo = one.Except(NewOne);

one = NewOne.ToList();
two = NewTwo.ToList();

作为非LINQ解决方案的一个示例,这似乎足够有效:

List<string> one = new List<string>(new[] {"Test 1", "Test 1", "Test 2"});
List<string> two = new List<string>();
var toRemove = new List<string>();

foreach (var value in one)
{
    if(value.Equals("Test 1"))
    {
        toRemove.Add(value);
        two.Add(value);
    }
}

foreach (var value in toRemove)
{
    one.Remove(value);
}
List one=新列表(新[]{“测试1”、“测试1”、“测试2”});
列表二=新列表();
var toRemove=新列表();
foreach(一个变量值)
{
如果(值等于(“测试1”))
{
删除。增加(价值);
二、增加(价值);
}
}
foreach(toRemove中的var值)
{
一、删除(价值);
}

作为非LINQ解决方案的一个示例,这似乎足够有效:

List<string> one = new List<string>(new[] {"Test 1", "Test 1", "Test 2"});
List<string> two = new List<string>();
var toRemove = new List<string>();

foreach (var value in one)
{
    if(value.Equals("Test 1"))
    {
        toRemove.Add(value);
        two.Add(value);
    }
}

foreach (var value in toRemove)
{
    one.Remove(value);
}
List one=新列表(新[]{“测试1”、“测试1”、“测试2”});
列表二=新列表();
var toRemove=新列表();
foreach(一个变量值)
{
如果(值等于(“测试1”))
{
删除。增加(价值);
二、增加(价值);
}
}
foreach(toRemove中的var值)
{
一、删除(价值);
}
试试看

List two=(从i到in one
其中i.Contains(“测试1”)
选择i.ToList();
一=一。除(二)之外。ToList();
或者更简洁地说:

List<string> two = one.Where(i => i.Contains("Test 1")).ToList();
one = one.Except(two).ToList();
List two=one.Where(i=>i.Contains(“测试1”)).ToList();
一=一。除(二)之外。ToList();
试试看

List two=(从i到in one
其中i.Contains(“测试1”)
选择i.ToList();
一=一。除(二)之外。ToList();
或者更简洁地说:

List<string> two = one.Where(i => i.Contains("Test 1")).ToList();
one = one.Except(two).ToList();
List two=one.Where(i=>i.Contains(“测试1”)).ToList();
一=一。除(二)之外。ToList();

如果要检查此字符串:

string match = "Test1";
然后用这个:

 two.AddRange(one.Where(x => x == match));
    one.RemoveAll(x => x == match);
将列表
one
中的所有匹配记录放入列表
two

然后,使用以下命令:

 two.AddRange(one.Where(x => x == match));
    one.RemoveAll(x => x == match);

要从列表
one

中删除所有匹配的记录,请检查此字符串:

string match = "Test1";
然后用这个:

 two.AddRange(one.Where(x => x == match));
    one.RemoveAll(x => x == match);
将列表
one
中的所有匹配记录放入列表
two

然后,使用以下命令:

 two.AddRange(one.Where(x => x == match));
    one.RemoveAll(x => x == match);

要从列表
one

中删除所有匹配的记录,我将执行以下操作:

//set string to match
string match = "Test 1";
//check each item in the list
for(int i =0; i<one.Count;i++) 
   {
   if (one[i].Equals(match)) //see if it matches
      {
      int index = one.IndexOf(match);//get index of the matching item
      one.RemoveAt(index);//remove the item
      two.Add(match);//add the item to the other list
      }
  }
//将字符串设置为匹配
字符串匹配=“测试1”;
//检查列表中的每个项目

对于(int i=0;i我会这样做:

//set string to match
string match = "Test 1";
//check each item in the list
for(int i =0; i<one.Count;i++) 
   {
   if (one[i].Equals(match)) //see if it matches
      {
      int index = one.IndexOf(match);//get index of the matching item
      one.RemoveAt(index);//remove the item
      two.Add(match);//add the item to the other list
      }
  }
//将字符串设置为匹配
字符串匹配=“测试1”;
//检查列表中的每个项目
对于(inti=0;i这个怎么样

two.AddRange(one.FindAll(x => x.Contains("Test 1")));
one.RemoveAll(x => two.Contains(x));
下面的代码

List<string> one = new List<string>();
List<string> two = new List<string>();

one.Add("Test 1");
one.Add("Test 1");
one.Add("Test 2");

two.AddRange(one.FindAll(x => x.Contains("Test 1")));
one.RemoveAll(x => two.Contains(x));

Console.WriteLine("ONE:");
foreach (string s in one)
{
    Console.WriteLine(s);
}
Console.WriteLine("TWO:");
foreach (string s in two)
{
    Console.WriteLine(s);
}
Console.ReadLine();
这个怎么样

two.AddRange(one.FindAll(x => x.Contains("Test 1")));
one.RemoveAll(x => two.Contains(x));
下面的代码

List<string> one = new List<string>();
List<string> two = new List<string>();

one.Add("Test 1");
one.Add("Test 1");
one.Add("Test 2");

two.AddRange(one.FindAll(x => x.Contains("Test 1")));
one.RemoveAll(x => two.Contains(x));

Console.WriteLine("ONE:");
foreach (string s in one)
{
    Console.WriteLine(s);
}
Console.WriteLine("TWO:");
foreach (string s in two)
{
    Console.WriteLine(s);
}
Console.ReadLine();
试试这个:

two = one.FindAll(x => x.Contains("Test 1");
one.RemoveAll(x => x.Contains("Test 1");
试试这个:

two = one.FindAll(x => x.Contains("Test 1");
one.RemoveAll(x => x.Contains("Test 1");
具有此特定用例的方法

具有此特定用例的方法


因此,您希望从
one
中删除所有“Test1”,并将它们添加到
two
。那么实际上您希望将它们从一个列表转移到另一个列表

string toFind = "Test 1";
var foundStrings = one.Where(s => s == toFind);
if(foundStrings.Any())
{
    two.AddRange(foundStrings);
    one.RemoveAll(s => s == toFind);
}
下面是一个非LINQ版本,它更高效,但可能不那么可读:

// backwards loop because you're going to remove items via index
for (int i = one.Count - 1; i >= 0; i--)
{
    string s1 = one[i];
    if (s1 == toFind)
    {
        two.Add(toFind);
        one.RemoveAt(i);
    }
}

因此,您希望从
one
中删除所有“Test1”,并将它们添加到
two
。那么实际上您希望将它们从一个列表转移到另一个列表

string toFind = "Test 1";
var foundStrings = one.Where(s => s == toFind);
if(foundStrings.Any())
{
    two.AddRange(foundStrings);
    one.RemoveAll(s => s == toFind);
}
下面是一个非LINQ版本,它更高效,但可能不那么可读:

// backwards loop because you're going to remove items via index
for (int i = one.Count - 1; i >= 0; i--)
{
    string s1 = one[i];
    if (s1 == toFind)
    {
        two.Add(toFind);
        one.RemoveAt(i);
    }
}

另一种选择是使用groupby子句。下面,我提供了一个演示。我包括了一个检索特定项的方法(例如测试1)以及一个移动所有现有重复项的方法(有关更多详细信息,请参阅代码注释)


另一种选择是使用groupby子句。下面,我提供了一个演示。我包括了一个检索特定项的方法(例如测试1)以及一个移动所有现有重复项的方法(有关更多详细信息,请参阅代码注释)


你的意思是什么:我如何匹配字符串测试1并将每个匹配的字符串放入列表2中;你的确切意思是匹配字符串测试1你在寻找
Intersect
吗?我建议你尝试查看
foreach
循环,并让它循环列表1中的每个项目。如果它在列表1中找到某个内容,请将其放入列表2中并从列表1中删除它。这可以通过使用
indexOf
removeAt
来完成。我想您可以自己找出如何使用它们。@SriramSakthivel我想检查列表一是否包含某个特定字符串,如果包含,然后将该特定字符串放入列表二并将其从列表中删除one@Izzy:那不是完全不一样吗不同的需求?因此您需要检查
one
是否包含“测试1”,如果它确实从
one
中删除所有“测试1”,并添加一个“测试1”对于
two
,这是正确的吗?你的意思是什么:我如何匹配字符串测试1并将每个匹配的字符串放入列表2中;你的确切意思是匹配字符串测试1你在寻找
Intersect
吗?我建议你尝试查看
foreach
循环,并让它循环列表1中的每个项目。如果它找到了一些在列表1中,将它放在列表2中并从列表1中删除。这可以通过使用
indexOf
removeAt
来完成。我想你们可以自己弄清楚如何使用它们。@SriramSakthivel我想检查列表1是否包含认证字符串,如果确实包含,然后将特定字符串放在列表2中并从列表中删除它 one@Izzy:这不是一个完全不同的要求吗?所以你想检查
one
是否包含“test1”,如果它确实从
one
中删除了所有“test1”,并将单个“test1”添加到
two
,对吗?我完全知道这不是“最光滑的”回答,但仍然…它是无效的吗?我必须在这个问题上使用@roryap。除了命名约定之外,它仍然是获得OP所追求的结果的解决方案。我