c#基于拆分的重复数据删除列表

本文关键字:数据 删除 列表 删除列 于拆分 拆分 | 更新日期: 2023-09-27 18:05:13

我很难根据特定的分隔符删除列表。

例如,我有如下4个字符串:

苹果梨| | |水果篮子
芒果橙| | |水果龟
紫色红黑色| | |绿色
英雄|雷神|铁人|绿巨人

在这个例子中,我希望我的列表在第3列中只有唯一的值,所以它会导致一个列表看起来像这样,

苹果梨| | |水果篮子
紫色红黑色| | |绿色
英雄|雷神|铁人|绿巨人

在上面的例子中,我应该去掉第2行,因为第1行在第3列中有相同的结果。任何帮助都是很棒的,在c#中删除是很困难的。

我是如何测试这个的:

    static void Main(string[] args)
    {
        BeginListSet = new List<string>();
        startHashSet();
    }

    public static List<string> BeginListSet { get; set; }
    public static void startHashSet()
    {
        string[] BeginFileLine = File.ReadAllLines(@"C:'testit.txt");
        foreach (string begLine in BeginFileLine)
        {
            BeginListSet.Add(begLine);
        }
    }
    public static IEnumerable<string> Dedupe(IEnumerable<string> list, char seperator, int keyIndex)
    {
        var hashset = new HashSet<string>();
        foreach (string item in list)
        {
            var array = item.Split(seperator);
            if (hashset.Add(array[keyIndex]))
                yield return item;
        }
    }

c#基于拆分的重复数据删除列表

像这样的东西应该为您工作

static IEnumerable<string> Dedupe(this IEnumerable<string> input, char seperator, int keyIndex)
{
    var hashset = new HashSet<string>();
    foreach (string item in input)
    {
        var array = item.Split(seperator);
        if (hashset.Add(array[keyIndex]))
            yield return item;
    }
}

var list = new string[] 
{
    "apple|pear|fruit|basket", 
    "orange|mango|fruit|turtle",
    "purple|red|black|green",
    "hero|thor|ironman|hulk"
};
foreach (string item in list.Dedupe('|', 2))
    Console.WriteLine(item);

Edit:在Lambda的链接问题Distinct()中,Jon Skeet以一种更好的方式提出了这个想法,以DistinctBy自定义方法的形式。虽然类似,但他的想法比这里提出的想法更容易重用。

使用他的方法,你可以写

var deduped = list.DistinctBy(item => item.Split('|')[2]);
您可以稍后重用相同的方法,通过可能是另一种类型的键来"删除"另一个不同类型的对象列表。

试试这个:

var list = new string[]
                    {
                        "apple|pear|fruit|basket",
                        "orange|mango|fruit|turtle",
                        "purple|red|black|green",
                        "hero|thor|ironman|hulk "
                    };
var dedup  = new List<string>();
var filtered = new List<string>();
foreach (var s in list)
{
    var filter = s.Split('|')[2];
    if (dedup.Contains(filter)) continue;
    filtered.Add(s);
    dedup.Add(filter);
}

// Console.WriteLine(filtered);

可以用HashSet代替吗?这将在添加副本时自动为您消除。

可能您可以按字母顺序对带有分隔符的单词进行排序。然后将它们存储到网格(列)上。然后当你尝试插入时,检查是否有一个以这个字符开头的单词。

如果LINQ是一个选项,你可以这样做:

// assume strings is a collection of strings
List<string> list = strings.Select(a => a.Split('|')) // split each line by '|'
   .GroupBy(a => a[2])  // group by third column
   .Select(a => a.First()) // select first line from each group
   .Select(a => string.Join("|", a))
   .ToList(); // convert to list of strings

编辑(根据Jeff Mercado的评论),这可以进一步简化:

List<string> list = 
   strings.GroupBy(a => a.split('|')[2])  // group by third column
   .Select(a => a.First()) // select first line from each group
   .ToList(); // convert to list of strings