删除多元素字符串[]数组中的重复项?
问题描述:
我有一个由\r
拆分的字符串[]数组。数组中的每一行都有标题地址,但每隔一段时间,我最终都会得到地址部分的重复,这是我不想要的。删除多元素字符串[]数组中的重复项?
此:
Title1 | Address1 //[0]
Title2 | Address2 //[1]
Title3 | Address1 //[2]
Title4 | Address3 //[3]
将成为:
Title1 | Address1 //[0]
Title2 | Address2 //[1]
Title4 | Address3 //[2]
阵列声明如下:string[] resultsArray = results.Split('\r'); //Title|Address
我再后来分裂行当我通过|
抢的单个元素。
用法(极其简单):
foreach (string result in resultsArray)
{
string splitResult[] = result.Split('|');
title = splitResult[0];
address = splitResult[1];
}
答
我假设的问题是,你如何避免重复的地址被输入到列表。你能用Dictionary吗?
Dictionary<string, string> addresses = new Dictionary<string, string>();
foreach(string result in resultsArray)
{
string splitResult[] = result.Split('|');
// check to see if address already exists, if it does, skip it.
if(!addresses.ContainsKey(splitResult[1]))
{
addresses.add(splitResult[1], splitResult[0]);
}
}
答
var seenItBefore = new HashSet<string>();
foreach (string result in resultsArray)
{
string splitResult[] = result.Split('|');
title = splitResult[0];
address = splitResult[1];
if (!seenItBefore.Add(address)) continue;
// process
}
你也可以提供一个突出IEqualityComparer<string[]>
到Distinct()
,如果你建立一个藤IEnumerable<>
,但由于您的样品不使用它,我决定坚持经典的程序。
答
试着这么做:
resultArray.Select(p => p.Split('|')).Select(p => new { Name = p[0], Address = p[1] }).GroupBy(p => p.Address).Select(p => p.First()).ToArray();
答
string[] strings = { "Title1 | Address1", "Title2 | Address2", "Title3 | Address1", "Title4 | Address3" };
var _strings = strings.GroupBy(s => s.Split('|')[1]).Select(g => g.Min(s => s));
答
使用约翰飞碟双向的ProjectionComparer
,它变得相当容易:
var comparer = new ProjectionComparer((string input) => input.Split('|')[1]);
var results = resultsArray.Distinct(comparer);
所以,如果有重复的地址,你想去掉标题藏汉?你有尝试过使用`Dictionary`代替吗? –
2011-02-14 21:29:33
为什么你删除Title3而不是Title1? – 2011-02-14 21:29:33
@moriartyn OP询问**多元素**数组 – 2011-02-14 21:30:20