2011-03-08 2 views
2

저는 숙제를 간단하게 암호화하고 있습니다. 나는 그것을 완료했다, 지금은 람다 식으로 코드를 개선하려고 노력하고있다. 목록에있는 객체는 람다 표현식 후에 변경되지 않습니다. 로컬 변수를 사용하고 있습니까? 그리고 람다 식으로 어떻게 할 수 있습니까? 나는 당신의 대답, 감사 기다리고할당이 List의 변수를 수정하지 않습니다. 람다 식 ForEach 함수

public override string Encrypt(string code) 
    { 
     List<Byte> encodedBytes = new List<Byte>(ASCIIEncoding.ASCII.GetBytes(code)); 

     encodedBytes.ForEach(o => { if (hash.Contains(o)) 
      o = hash.ElementAt((hash.IndexOf(o) + ShiftAmount) % hash.Count); });    

     return ASCIIEncoding.ASCII.GetString(encodedBytes.ToArray());     
    } 

다음 내 코드 ...

+0

'hash'의 유형은 무엇입니까 다음과 같은 것인가? –

+0

코드에 람다 식을 추가해도이 경우 많이 개선되지는 않습니다. 나는 Lambda Expression이 실제로 읽기 능력에 기반한 코드 품질을 감소 시킨다는 것을 제시 할 것이다. 이 경우 표준 ForEach는보다 표현력이 강한 IMO가됩니다. –

+0

@Mark Byers : 해시 유형은 List입니다. HashSet을 시도했지만 필요한 IndexOf 메소드가 없습니다. @Metro Smurf : 조언을 해주시면 감사하겠습니다. NET 기능을 사용하여 재미있게 볼 수 있습니다. :) – nepjua

답변

0

2

그것은 참으로 로컬 변수를 사용을 썼다. 람다의 반환 값을 다시 목록에 할당하려면 ForEach 대신 ConvertAll을 사용하십시오.

+0

답장을 보내 주셔서 감사합니다.하지만 변환하기 전에 해시에 요소가 있는지 확인해야합니다. – nepjua

+0

변환 표현식에서이를 수행 할 수 있습니다. –

+0

@nepjua 그 일을 막을 수있는 방법은 없습니다. –

0

예, 코드에서 변수 'o'는 ForEach 메서드에 전달 된 익명 메서드의 범위에있는 로컬 변수입니다. 변경 사항은 해당 범위 밖에서 반영되지 않습니다.

public static class Extensions 
{ 
    public static List<T> ModifyEach<T>(this List<T> list, Func<T, T> method) 
    { 
    List<T> mod = new List<T>(); 

    foreach (T e in list) 
    { 
     mod.Add(method(e)); 
    } 

    return mod; 
    } 
} 

샘플 사용 :

List<string> f = new List<string>() 
{ 
    "hello", 
    "world" 
}; 

f = f.ModifyEach(x => x.ToUpper()); 
f.ForEach(x => Console.WriteLine(x)); 
0

당신은 항목을 수정 한 다음이처럼 람다 기반으로 새 목록을 반환 목록을 반복하는 자신의 확장 방법을 쓸 수 더 많은 문제 관련 솔루션을 원한다면 더 적합 할 것입니다.

public static class Extensions 
{ 
    public static void ModifyWhere<T>(this List<T> list, Func<T, bool> condition, Func<T, T> act) 
    { 
     for (int i = 0; i < list.Count; i++) 
     { 
      if (condition(list[i])) 
       list[i] = act(list[i]); 
     } 
    } 
} 

이고이 솔루션은 특정 기능이 아닙니다. bool 반환 함수를 조건으로 사용하고 함수를 함수로 반환합니다.

샘플 사용은

mylist.ModifyWhere(someBoolReturningFunction, someTReturningFunction); 
+1

그게 내가 찾고 있던거야. 대답 해줘서 고마워요. 나는 그런 종류의 글을 쓰는 것을 몰랐다. 고마워. – nepjua