【问题标题】:C# Distinct Comma-separated values not workingC# Distinct 逗号分隔值不起作用
【发布时间】:2019-01-23 17:35:28
【问题描述】:

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

如果我通过了:

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

【问题讨论】:

  • 您是否 100% 确定字符串是相同的?前后没有空格,没有奇怪的 unicode 等?
  • 您缺少 StringSplitOptions.RemoveEmptyEntries
  • 你的方法体可以缩减为一行(注意beats在C#中应该小写):return beats == null ? "" : string.Join(",", beats.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).Distinct());
  • @TheSoftwareJedi 这不能解决这个问题。如果Distinct 没有删除这些值,那么它们会有所不同。 RemoveEmptyEntires 仅在您输入分隔符之间没有任何内容时才有意义。

标签: c# .net string distinct-values


【解决方案1】:

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

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.
  • @TheSoftwareJedi 即使没有RemoveEmptyEntries 也可以工作。仅当您输入 "STA27,,,,,STA27" 之类的输入时,这才有意义。它与不删除重复项无关。
  • @juharr 它导致了尾随逗号。
【解决方案2】:

如前所述,您缺少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();

如果您需要不区分大小写的 distinct,您可以使用 StringComparer(在本例中为 StringComparer.InvariantCultureIgnoreCase):

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

【讨论】:

    【解决方案3】:

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

    一个是return result.TrimEnd(result[result.Length - 1]);,它敲掉了结果的最后一个字符。删除 if 语句后,代码就可以正常工作了。

    另一个是尾随逗号。在处理显式删除尾随逗号时,您也可以使用StringSplitOptions.RemoveEmptyEntries。尾随空格导致 string.Empty 成为拆分中的最后一个结果。

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      相关资源
      最近更新 更多