如何删除逗号分隔的重复字符串值并获取最后两个值

时间:2014-10-06 10:24:16

标签: c# asp.net string

我想删除逗号分隔的重复字符串值,如:

String str = "2,4,3,12,25,2,4,3,6,2,2,2";

我希望输出如下:

String str1 = "6,2";

请告诉我如何做到这一点我自己但我无法解决这个问题

7 个答案:

答案 0 :(得分:10)

与Linq一起疯狂骑行。可能有更好的方法,但这是我能想到的第一个。

string str = "2,4,3,12,25,2,4,3,6,2,2,2";
List<string> uniques = str.Split(',').Reverse().Distinct().Take(2).Reverse().ToList();
string newStr = string.Join(",", uniques);
Console.WriteLine(newStr);
  • 在逗号处拆分字符串以获取序列
  • 应用反向操作,你得到2 2 2 6 .... 4 2
  • 应用Distinct,你得到2,6,3,4,25,12
  • 取前2个元素(2,6)
  • 反转他们6,2
  • 使用逗号sep加入新字符串。

答案 1 :(得分:0)

您可以使用.Distinct()扩展方法。

String str = "2,4,3,12,25,2,4,3,6,2,2,2";
var oldArray=str.Split(',').Reverse();
var collectionWithDistinctElements = oldArray.Distinct().ToArray();
var reverse=collectionWithDistinctElements.Reverse();
//take two element
var twoElements=reverse.ToList().Take(2);
//last join them 
var resultArray=string.Join(",", twoElements);

答案 2 :(得分:0)

这是一个建议:

string item = "";
var lastTwoUnique= str.Split(',') //split the string on ,
               //now, take the next element from the array as long as it's
               //not equal to the previous element (which we store in item)
               .Where((st) => st==item ? false : (item = st) == item) //** see comment below
               .Reverse() //reverse collection
               .Take(2)   //take two (two last)
               .Reverse() //reverse back
               .ToList(); //make it a list
var answer = string.Join(",", lastTwoUnique);

此解决方案可保持数据完好无损,因此如果您希望存储唯一列表,则可以对该列表执行许多查询。例如,使用Distinct()的解决方案不会在列表中每次出现2次。

此解决方案具有:Where的中间结果(2,4,3,12,25,2,4,3,6,2之后)。虽然不同,但是:2,4,3,12,25,6


** .Where((st) => st==item ? false : (item = st) == item)行似乎很奇怪,所以让我解释一下:

Where接受一个lambda函数,该函数对应该采用的项返回true,对于应该忽略的项则返回false。因此st将成为Split中的每个子字符串。 现在,我们来研究实际的功能:

st==item                   //is this st equal to the previous item?
    ? false                //then return false
    : (item = st) == item  //if it's not equal, then assign `item` to the current `st`
                           //and compare that to item and get `true`

答案 3 :(得分:0)

非常基本但适用于您的情况

String str = "2,4,3,12,25,2,4,3,6,2,2,2";
String[] arr = str.Split(',');
String penultimate = "";
String ultimate = "";
for (int i = 0; i < arr.Length; i++)
{
    if (arr[i] != ultimate)
    {
        penultimate = ultimate;
        ultimate = arr[i];
    }
}
Console.WriteLine("{0},{1}", penultimate, ultimate);

答案 4 :(得分:0)

我试图保持相当简单的另一种解决方案:

String str = "2,4,3,12,25,2,4,3,6,2,2,2";

var holder = new string[2];
foreach (var x in  str.Split(','))
{
    if(holder.Last() != x)
    {
        holder[0] = holder[1];
        holder[1] = x;
    }   
}

var result = string.Join(",", holder);

这将迭代逗号分隔的项目,始终保留holder中最后看到的两个不同项目。

答案 5 :(得分:0)

String str = "2,4,3,12,25,2,4,3,6,2,2,2";
string str = s1;
var uniques = str.Split(',').Reverse().Distinct().Take(3).Reverse().Take(2).ToList();
string newStr = string.Join(",", uniques.ToArray());

这将给我正确的输出,即我想要的3,6。

感谢所有给我答案的伙伴。

答案 6 :(得分:-1)

这肯定会起作用

string str = "2,4,3,12,25,2,4,3,6,2,2,2";
List<string> uniques = new List<string>()
uniques = str.Split(',').Reverse().Distinct().Take(2).Reverse().ToList();
string newStr = string.Join(",", uniques);