C#不同的逗号分隔值不起作用

时间:2018-08-16 17:28:12

标签: c# .net string distinct-values

我正在尝试从逗号分隔的字符串中删除重复的值,并且结果不一致。例如,

如果我通过:

  

STA27,STA27,STA27B,STA27A,STA27B,

我得到:

  

STA27,STA27,STA27B,STA27A,

或者,如果我通过:

  

STA24,STA24,STA24,STA24,

我得到:

  

STA24,STA24

我尝试了几种方法来消除逗号,但似乎没有任何效果。我不明白为什么Distinct也不起作用。我认为这与字符串终止的方式有关,但是在第一个示例中,我得到了前两个条目的重复,因此这似乎不是位置问题。

有什么想法吗?

 public string FindDistinctBeats(String Beats)
    // Accept comma-separated string, return distinct values
    {
        string result = string.Empty;

        try
        {
            result = string.Join(",", Beats.Split(',').Distinct().ToArray());
            result = result.TrimEnd(',');

            if (String.IsNullOrEmpty(result))
            {
                return result;
            }
            else
            {
                return result.TrimEnd(result[result.Length - 1]);
            }

        }
        catch (Exception e)
        {
            return e.ToString();
        }
    }

3 个答案:

答案 0 :(得分:8)

一个简单的测试显示了预期的结果:

public class Distinct
{
    private string input = "STA27,STA27,STA27B,STA27A,STA27B,";

    [Test]
    public void DistinctTest()
    {
        var distincts = input.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Distinct();
        foreach(var entry in distincts)
        {
            Console.WriteLine(entry);
        }
    }
}

输出

STA27
STA27B
STA27A

答案 1 :(得分:0)

如上所述,您缺少StringSplitOptions.RemoveEmptyEntries选项。另外,考虑在拆分之前清理字符串,如下所示:

// test string with some whitespace and a control char in the end of the string
string beats = "STA27,STA27,STA27B,STA27A,STA27B,   " + '\u0002'; 

beats = string.Join(string.Empty, beats.ToCharArray().Where(x => !Char.IsControl(x) && !Char.IsWhiteSpace(x)));

List<string> distinctBeats = beats.Split(",", StringSplitOptions.RemoveEmptyEntries)
                                  .Distinct()
                                  .ToList();

如果您需要区分大小写的字符集,则可以使用StringComparer(在这种情况下为StringComparer.InvariantCultureIgnoreCase):

List<string> distinctBeats = beats.Split(",", StringSplitOptions.RemoveEmptyEntries)
                                  .Distinct(StringComparer.InvariantCultureIgnoreCase)
                                  .ToList();

答案 2 :(得分:0)

许多答案都有正确的指导,但我想指出,原始代码有2个问题。但是,上面提供的输入运行的上述代码不会返回您指定的输出。我在下面创建了一个提琴手来展示这一点。

一个是ng-if,它会终止结果的最后一个字符。删除该console.log(typeof 10); // output: "number" console.log(typeof 'name'); // output: "string" console.log(typeof false); // output: "boolean" 语句后,代码可以正常工作。

另一个是结尾逗号。在明确删除尾随逗号的过程中,也可以使用return result.TrimEnd(result[result.Length - 1]);。尾部空格导致string.Empty是您拆分的最后结果。

这是一个示例程序,请运行here is a link to a fiddler

if