簡體   English   中英

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

[英]C# Distinct Comma-separated values not working

我試圖從逗號分隔的字符串中刪除重復的值,並且結果不一致。 例如,

如果我通過:

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();
        }
    }

一個簡單的測試顯示了預期的結果:

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

如前所述,您缺少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個問題。 但是,上面提供的輸入運行的上述代碼不會返回您指定的輸出。 我在下面創建了一個提琴手來說明這一點。

一個是return result.TrimEnd(result[result.Length - 1]); 從而消除了結果的最后一個字符。 刪除了if語句后,代碼可以正常工作。

另一個是結尾逗號。 在處理顯式刪除尾隨逗號的過程中,還可以使用StringSplitOptions.RemoveEmptyEntries 尾隨空格導致string.Empty是拆分中的最后一個結果。

這是一個示例程序, 這是一個運行提琴手的鏈接

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Original:");
        Console.WriteLine(OriginalFindDistinctBeats("STA24,STA24,STA24,STA24,"));
        Console.WriteLine(OriginalFindDistinctBeats("STA27,STA27,STA27B,STA27A,STA27B,"));

        Console.WriteLine();

        Console.WriteLine("New working (removed that weird if statement):");
        Console.WriteLine(NewFindDistinctBeats("STA24,STA24,STA24,STA24,"));
        Console.WriteLine(NewFindDistinctBeats("STA27,STA27,STA27B,STA27A,STA27B,"));

        Console.WriteLine();

        Console.WriteLine("New working with remove empty:");
        Console.WriteLine(NewWithRemoveEmptyFindDistinctBeats("STA24,STA24,STA24,STA24,"));
        Console.WriteLine(NewWithRemoveEmptyFindDistinctBeats("STA27,STA27,STA27B,STA27A,STA27B,"));
    }

    public static string OriginalFindDistinctBeats(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();
        }
    }

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

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

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

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

        try
        {
            result = string.Join(",", Beats.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray());

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM