2013-04-26 5 views
2

두 개의 목록이 문자열을 포함하고 있습니다. 목록 및 목록 b. 순간에 나는 컬럼 A에 Excel 스프레드 시트에 List a의 값을 쓰고 컬럼에는 List b의 값을 씁니다. 목록 b는 목록 a와 동일한 데이터를 가져야하며 순서대로 있어야합니다. 항상 그런 것은 아닙니다. Excel에서 List b의 값을 쓸 때 목록에있는 값이 같은 지점에 있으면 값을 셀에 쓰고 싶으면 셀에 빈 문자열을 쓰고 싶습니다.두 목록에서 목록 생성하기

두 개의 목록 a = {"a","b","c", "d", "e", "c", "f" }b = {"a", "d", "e" ,"c"}이 있습니다.

var c = a.Zip(b, (x, y) => x.Equals(y, StringComparison.CurrentCultureIgnoreCase) ? x : ""); 

하지만 그건 단지 나에게 인덱스 문제의 경우 c = {"a"}

+3

뒤에있는 논리는 무엇입니까? –

+0

또한 질문을 형식화하고 시도한 것을 보여줄 필요가 있습니다. – Silvermind

+0

이들은 문자열 목록입니다. 목록 맞습니까? – pordi

답변

1

줄 것입니다 :

var c = a.Select((s, i) => b.ElementAtOrDefault(i) == s ? s : "").ToList(); 

을에서 두 c = { "a", "", "", "d", "e" ,"c", ""}

시도 것처럼, 세 번째 목록 C를 산출 할 필요가 그렇지 않으면 :

var c = a.Select(s => b.Contains(s) ? s : "").ToList(); 

0의 경우는 문제가되지 않는 경우

var c = a.Select(s => b.Contains(s, StringComparer.CurrentCultureIgnoreCase) ? s : "") 
     .ToList(); 
+2

'ElementAtOrDefault'에 +1이 존재한다는 것을 모름 –

+1

올바른 결과를 반환하지 않는다고 생각합니다. – MarcinJuraszek

+0

안녕하세요, 대소 문자를 구분하지 않는 비교를 위해이 기능을 사용할 수 있습니까? – luckyluke

3

당신은 다음과 같은 방법을 사용할 수 있습니다 :

IEnumerable<T> FillBlanks<T>(IEnumerable<T> source, IEnumerable<T> collection, T blank) 
{ 
    // TODO error checking 
    using(var e = collection.GetEnumerator()) 
    { 
     bool more = e.MoveNext(); 
     foreach(var x in source) 
      if(more && x.Equals(e.Current)) 
      { 
       yield return x; 
       more = e.MoveNext(); 
      } 
      else 
       yield return blank; 
    } 
} 

예 :

var a = new [] {"a", "b", "c", "d", "e", "c", "f" }; 
var b = new [] {"a", "d", "e" ,"c"}; 
var c = FillBlanks(a, b, ""); 

c 지금 :

enter image description here

+0

다시 Dominic에게 감사드립니다. :) – luckyluke

+0

@svick True. 쓸모없는 던지기를 삭제했습니다. IEqualityComparer 을 받아들이고 사용하는 오버로드를 생성하는 것이 더 좋습니다. – sloth