我很难根据特定的分隔符重复列表。
例如,我有4个字符串,如下所示:
苹果|梨|果|篮
橙色|芒果|水果|龟
紫色|红色|黑色|绿
英雄|托尔|铁人|绿巨人
在这个例子中,我希望我的列表在第3列中只有唯一值,因此它会产生一个看起来像这样的List,
苹果|梨|果|篮
紫色|红色|黑色|绿
英雄|托尔|铁人|绿巨人
在上面的示例中,我将摆脱第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;
}
}
答案 0 :(得分:6)
这样的事情对你有用
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);
修改:在链接问题Distinct() with Lambda中,Jon Skeet以DistinctBy
自定义方式的形式更好地呈现了这个想法。虽然相似,但它比这里提出的想法更容易重复使用。
使用他的方法,你可以写
var deduped = list.DistinctBy(item => item.Split('|')[2]);
您可以稍后重复使用相同的方法,通过可能的另一种类型的键“重复删除”另一个不同类型的对象列表。
答案 1 :(得分:0)
您可以使用HashSet
吗?这将在添加时自动消除欺骗。
答案 2 :(得分:0)
可能是您可以使用分隔符对单词进行排序按字母顺序排列。然后将它们存储到网格(列)上。然后,当您尝试插入时,只需检查是否存在具有以此char开头的单词的列。
答案 3 :(得分:0)
试试这个:
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);
答案 4 :(得分:0)
如果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