Member 14024377 Ответов: 3

Как я могу удалить символ из строки, сравнив его с другой строкой


если строка S1 = "1,2,3,4";
строка S2= "2,3,5,9,10,";



результат ожиданием является

результат строки = 1,4,5,9,10

Что я уже пробовал:

пожалуйста помочь

here 2 and 3 is common.I want to remove this to result.

3 Ответов

Рейтинг:
23

OriginalGriff

Альтернативой предложению Джона является использование методов Linq:

string S1 = "1,2,3,4";
string S2 = "2,3,5,9,10,";
string[] p1 = S1.Split(',');
string[] p2 = S2.Split(',');
string result = string.Join(",", p1.Concat(p2).Except(p1.Intersect(p2)));


Eric Lynch

Черт возьми, ты опередил меня, так что я поддержал твой ответ.

Я был занят сверхинжинирингом, для вещей, которые ОП, вероятно, не волнуют...но мне было весело.

При вашем решении возрастающий числовой порядок не будет сохранен. Кроме того, есть проблема плохих входных данных. Я предполагаю, что конечная запятая (на S2) была непреднамеренной, но вы никогда не знаете.

Так что, на всякий случай, я выложил длинную версию. Я мог бы связать тебя, но потом вернулся и добавил комментарии :)

OriginalGriff

Твой тоже получил мой голос!

Member 14024377

Большое спасибо!....

Его работа smooothly

OriginalGriff

Всегда пожалуйста!

Рейтинг:
1

Eric Lynch

OriginalGriff тоже меня обыграл, но все равно выложил свой, так как он решает пару других проблем. Он сохраняет порядок возрастания и имеет дело с конечной запятой, которая есть в одной из ваших строк.

using System;
using System.Collections.Generic;
using System.Linq;

namespace DemoApp
{
	public class Program
	{
		public static void Main(string[] args)
		{
			string string1 = "1,2,3,4";
			string string2 = "2,3,5,9,10,";

			// Convert strings to integer arrays to facilitate later sorting
			int[] set1 = GetIntegers(string1);
			int[] set2 = GetIntegers(string2);

			// Get all of the numbers that appear in either set1 or set2
			IEnumerable<int> union = set1.Union(set2);

			// Get all of the numbers that appear in both set1 and set2
			IEnumerable<int> intersection = set1.Intersect(set2);

			// Get the list of numbers we want (union minus intersection) in ascending order
			IEnumerable<int> unionExceptIntersection = union
				.Except(intersection)
				.OrderBy(value => value);

			// Join the numbers back into a string
			string result = string.Join(',', unionExceptIntersection);

			Console.WriteLine(result);
		}

		private static int[] GetIntegers(string text) => text
			// Split values around commas
			.Split(',')
			// Convert string values to integer values (or null)
			.Select(strValue => int.TryParse(strValue, out int intValue) ? intValue : (int?)null)
			// Eliminate invalid integer values
			.Where(value => value.HasValue)
			// Convert to non-nullable integer value
			.Select(value => value.Value)
			// Convert the sequence to an array (so we can iterate more than once)
			.ToArray();
	}
}


Рейтинг:
1

#realJSOP

0) Split строки на разделителях-запятых.

1) добавьте каждый элемент массива (из Split заявление) К а HashSet объект (а HashSet не допускает дублирования значений элементов).

2) выведите содержимое HashSet объект.

string[] parts1 = string1.Split(',', false);
string[] parts2 = string2.Split(',', false);

HashSet<string> hash = new HashSet<string>();

foreach(string part in parts1)
{
    hash.Add(part);
}

foreach(string part in parts2)
{
    hash.Add(part);
}

foreach(string part in hash)
{
    Console.WriteLine(part);
}
Console.ReadKey();


Преимущество использования a HashSet объект заключается в том, что он не будет выдавать исключение, если вы попытаетесь добавить повторяющееся значение. Вместо этого он просто не добавит его. Один HashSet не гарантируется, что он будет находиться в каком-либо порядке, поэтому я оставляю его в качестве упражнения для программиста, чтобы вернуть значения в нужной последовательности.


Member 14024377

приведенный выше код не удаляет общее число из строки 2