2014-12-19 18 views
0

我要檢查刪除重複的由;分割字符串,但我不知道該怎麼做下一
我這樣的代碼:如何使用LINQ比較和在一個列表替換字符串重複

string str = "PORTION G ON GROUND FLOOR;/n/nPORTION G ON GROUND FLOOR;/n/nabcdef1234;/n/nabcdef1234"; 
    List<string> unitList = new List<string>(); 

    foreach (string s in str.Replace("/n","").Split(';')) 
    { 
     unitList.Add(s); 
    } 

    if ((unitList.Distinct()).Count() == 1) 
     Label1.Text=unitList.FirstOrDefault(); 
    else 
    { 
     //return more than 1 ,remove duplicate 
     //replace duplicate by "-" or "" 
    } 

我的輸出是:"PORTION G ON GROUND FLOOR;/n/n-;/n/nabcdef1234;/n/n-"

我發現如果我使用string []數組而不是List,返回(unitList.Distinct()).Count()是2而不是1,我想知道是否有錯誤。
這裏是我的代碼:

string str = "PORTION G ON GROUND FLOOR;/n/nPORTION G ON GROUND FLOOR;/n/nPORTION G ON GROUND FLOOR"; 

    string[] unitList = new string[10]; 
    int i=0; 
    foreach (string s in str.Replace("/n","").Split(';')) 
    { 

     unitList[i]=s; 
      i++; 
    } 

我很高興,並感謝任何人都可以幫我解決這個問題!

回答

1

這是你的問題的解決方案:

string str = "PORTION G ON GROUND FLOOR;/n/nPORTION G ON GROUND FLOOR;/n/nabcdef1234;/n/nabcdef1234"; 
List<string> selected=new List<string>(); 
var result = str.Split(';').Select(s => 
             { 
             var word = s.Replace("/n", ""); 
             if (selected.Contains(word)) 
             { 
              return s.Replace(word,"")+"-"; 
             } 
             else 
             { 
              selected.Add(word); 
              return s; 
             } 
             }).Aggregate<string, string>(null, (current, item) => current + item); 

此代碼返回你期望的字符串。

但是如果你想的話沒有重複的名單,這是另一種方式來獲得它:

var list = str.Split(';').ToLookup(s => s.Replace("/n", "")).Select(e=>e.Key); 
+0

由於其同樣的事情,它的工作原理。但你可以解釋下部分爲什麼使用字符串數組將返回2而不是1 – bbqwings 2014-12-19 06:17:34

+0

我測試過,我的預期結果應該被刪除'.aggregate()' – bbqwings 2014-12-19 06:36:02

+0

問題是你正在創建一個長度爲10的數組,你只使用4個元素。 Distinct方法也將空值視爲一個元素,這就是說您是一個額外的元素(具有空值)。爲了避免這種情況,你可以這樣做:string [] unitList = str.Replace(「/ n」,「」).Split(';') – octavioccl 2014-12-19 15:11:10

1
string str = "PORTION G ON GROUND FLOOR;/n/nPORTION G ON GROUND FLOOR;/n/nabcdef1234;/n/nabcdef1234"; 

      var list = str.Replace("/n", "").Split(';'); 
      var result = (from s in list 
       group s by s 
       into g 
       select g.First()).ToList(); 

你可以通過該數組本身之後,你把它分解,然後選擇第一個在串組。

0
string str = "PORTION G ON GROUND FLOOR;/n/nPORTION G ON GROUND FLOOR;/n/nabcdef1234;/n/nabcdef1234"; 
      var temp = str.Replace("/n", string.Empty).Split(';').Distinct(); 
      var result = string.Join("/n", temp); 

希望大家期待