我已将我的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);
}
答案 0 :(得分:1)
如果您在阅读时关注不同的项目,那么只需使用ids := make([]int64, 0, len(employees)) // declare capacity, but not length
for _ , e := range employees{
ids = append(ids, e.ID)
}
运算符Distinct
为了处理整个数据,我可以建议两种方法:
读入整个数据,然后使用LINQ的fn.Distinct()
运算符
或者使用Distinct
数据结构并在阅读excel时将每个元素存储在其中
如果您正在处理数据,我建议您查看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);
}