删除多元素字符串[]数组中的重复项?

问题描述:

我有一个由\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]; 
} 
+2

所以,如果有重复的地址,你想去掉标题藏汉?你有尝试过使用`Dictionary `代替吗? – 2011-02-14 21:29:33

+0

为什么你删除Title3而不是Title1? – 2011-02-14 21:29:33

+0

@moriartyn OP询问**多元素**数组 – 2011-02-14 21:30:20

我假设的问题是,你如何避免重复的地址被输入到列表。你能用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);