如何从excel范围中删除重复项? C#

时间:2017-08-23 14:25:25

标签: c# excel visual-studio

我已将我的excel范围内的单元格从字符串转换为字符串列表,并在原始列表中的逗号之后分隔每个项目。我开始认为我实际上并没有将每个项目分开,它们仍然是一个整体,试图弄清楚如何正确地做到这一点,以便每个项目(即the_red_bucket_01)都是它自己的字符串。

单元格1和2中原始字符串的示例:

Cell1:

the_red_bucket_01, the_blue_duck_01,_the green_banana_02, the orange_bear_01

Cell2:

the_purple_chair_01, the_blue_coyote_01,_the green_banana_02, the orange_bear_01

新列表看起来像这样,但我不确定它们是否是单独的项目:

the_red_bucket_01
the_blue_duck_01
the green_banana_02
the orange_bear_01
the_red_chair_01
the_blue_coyote_01
the green_banana_02
the orange_bear_01

现在我想删除重复项,以便控制台只显示每个项目中的1项,无论它们有多少,我似乎无法使我的foreah / if语句起作用。它打印出多个项目副本,我假设是因为它正在为列表中的每个项目进行迭代,所以它返回的项目数量很多。

 foreach (Excel.Range item in xlRng)
                    {
                        string itemString = (string)item.Text;


                        List<String> fn = new List<String>(itemString.Split(','));


                        List<string> newList = new List<string>();

                        foreach (string s in fn)
                        if (!newList.Contains(s))
                        {
                            newList.Add(s);
                        }
                        foreach (string combo in newList)
                        {
                            Console.Write(combo);
                        }

6 个答案:

答案 0 :(得分:1)

如果您在阅读时关注不同的项目,那么只需使用ids := make([]int64, 0, len(employees)) // declare capacity, but not length for _ , e := range employees{ ids = append(ids, e.ID) } 运算符Distinct

为了处理整个数据,我可以建议两种方法:

  1. 读入整个数据,然后使用LINQ的fn.Distinct()运算符

  2. 或者使用Distinct数据结构并在阅读excel时将每个元素存储在其中

  3. 如果您正在处理数据,我建议您查看LINQ文档。它有很棒的扩展。对于更多方法,您可以查看Set包。

答案 1 :(得分:1)

您可能需要修剪字符串,因为它们具有前导空格,因此“string1”与“string1”不同。

foreach (string s in fn)
if (!newList.Contains(s.Trim()))
{
     newList.Add(s);
}

答案 2 :(得分:1)

使用Distinct可以使用Linq更简单地完成此操作。

  

使用默认值从序列中返回不同的元素   等于比较来比较值。

foreach (Excel.Range item in xlRng)
{
    string itemString = (string)item.Text;

    List<String> fn = new List<String>(itemString.Split(','));
    foreach (string combo in fn.Distinct())
    {
         Console.Write(combo);
    }
}

如另一个答案所述,您可能还需要Trim任何空格,在这种情况下您可以这样做:

fn.Select(x => x.Trim()).Distinct()

答案 3 :(得分:1)

如果需要包含键/值,最好使用Dictionary类型。尝试使用List<T>更改代码到Dictionary<T>。即 从:

List<string> newList = new List<string>();

foreach (string s in fn)
if (!newList.Containss))
{
     newList.Add(s);
}

Dictionary<string, string> newList = new Dictionary<string, string>();

foreach (string s in fn)
if (!newList.ContainsKey(s))
{
     newList.Add(s, s);
}

答案 4 :(得分:1)

我认为如果你将newList移出循环,你的代码可能会按预期运行 - 你在每个循环中创建一个名为newList的新变量,这样它就不会从早期循环中找到重复项。

你可以用Linq更简洁地完成所有这些:

//set up some similar data
string list1 = "a,b,c,d,a,f";
string list2 = "a,b,c,d,a,f";
List<string> lists = new List<string> {list1,list2};

// find unique items
var result = lists.SelectMany(i=>i.Split(',')).Distinct().ToList();

SelectMany()&#34; flattens&#34;将列表列表放入列表中。

Distinct()删除重复项。

答案 5 :(得分:1)

var uniqueItems = new HashSet<string>();
foreach (Excel.Range cell in xlRng)
{
    var cellText = (string)cell.Text;

    foreach (var item in cellText.Split(',').Select(s => s.Trim()))
    {
        uniqueItems.Add(item);
    }
}

foreach (var item in uniqueItems)
{
    Console.WriteLine(item);
}