2014-07-06 3 views
0

내가 가지고 : 목록 목록의 요소를 편집하는 방법은 무엇입니까?

public class MyClass 
{ 
    public double X { set; get; } 
    public double Y { set; get; } 
    public bool Unique{ set; get; } 
} 

지금 나는 double xdouble y이 나는 ​​같은 X and Y으로 목록의 요소를 찾으려면 false로 Unique 필드를 설정 :

var list = new List<List<MyClass>>(); 

MyClass.

var element = (from sublist in list 
       from item in sublist 
       where item.X == x && item.Y == y 
       select item).FirstOrDefault(); 

하지만 어떻게이 요소를 편집하는 방법 :

이미 같은 검색에 대한 예를 찾아?

foreach (var myClsList in list) 
{ 
    foreach (var myCls in myClsList) 
    { 
    if (myCls.X == x && myCls.Y == y) 
    { 
     myCls.Unique= false; 
    } 
    } 
} 

그러나 좋은 보이지 않는 : 내가 좋아하는 뭔가를 할 수

확인합니다. 그것은 당신을 찾습니다

+0

평소에 어떻게 편집하셨습니까? – ChiefTwoPencils

+0

멋지거나 멋있게 보이십니까? – ChiefTwoPencils

답변

1

정말 그룹에 자신의 XY 특성에 의해 요소를 원하고 적절하게이 그룹 내부의 Unique 속성을 설정합니다. 다음은 몇 가지 초기 생각입니다.

0

특정 요소를 편집하거나 특정 기준과 일치하는 요소를 편집하려는 것은 매우 불투명합니다.

하나 개의 요소에 대해 당신이 할 :

(from sublist in list 
from item in sublist 
where item.X == x && item.Y == y 
select item).First().Unique = false; //the default item will be null 

이 작동하지만, 아주 추악한. 더 나은 :

var element = (from sublist in list 
       from item in sublist 
       where item.X == x && item.Y == y 
       select item).FirstOrDefault(); 
element.Unique = false; 

그들 모두를 변경하려면 foreach를 사용합니다. Linq은 부작용이 아닙니다. 부작용이 있어야합니다. 귀하의 경우에는 내가 할 것이다 : 당신이 정말로 부작용을 원하고 LINQ 스타일을하고 싶은 경우

var query = list.SelectMany(sublist => sublist) 
       .Where(item => item.X == x && item.Y == y); 
foreach(var myClass in query) 
    myClass.Unique = false; 

, 당신은 더 나은 조정 유창 스타일을 채택 할 수있는이 같은 MyClass :

public class MyClass 
{ 
    public double X { set; get; } 
    public double Y { set; get; } 
    public bool Unique { set; get; } 

    public MyClass Duplicate() 
    { 
    Unique = false; 
    return this; 
    } 
} 

// So you call: 

var query = list.SelectMany(sublist => sublist) 
       .Where(item => item.X == x && item.Y == y) 
       .Select(item => item.Duplicate()); 
0

전체 구조에 대한 생각 :

사전 < 클래스를 살펴보십시오. 이것은 임의의 유형을 통해 액세스 할 수있는 항목 목록을 저장하도록 설계되었습니다. 이 컨텍스트에서 사용하려면 :

  • 클래스에서 고유 항목을 제거하십시오.
  • 대신 클래스를 참조 구조가 아닌 값으로 비교되도록 구조체로 만듭니다.같은 X/Y와 두 가지 MyClasses를 대신 목록의

Dictionary<MyClass, bool> 사용) 같은 간주됩니다 (으로

public struct MyClass 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

var items = new Dictionary<MyClass, Bool>(); 

items[ new MyClass{ X = 3, Y = 7 } ] = false; 
items[ new MyClass{ X = -12, Y = -24 } ] = true; 

Assert.IsFalse(items[ new MyClass{ X = 3, Y = 7 } ]); 
Assert.IsTrue(items[ new MyClass{ X = -12, Y = -24 } ]); 

items[ new MyClass{ X = 3, Y = 7 } ] = true; 
Assert.IsTrue(items[ new MyClass{ X = 3, Y = 7 } ]); 

) 코드 블록을 만들려면 여기를 텍스트를 필요로하는 것 사전 작동 방법을 명확히하십시오 :

  • K는 "키"유형입니다. 이것은 당신이 사전에 저장하고있는 아이템에 라벨을 붙이는데 사용되는 타입이며 아이템을 아이템에 넣거나 아이템을 가져갈 때 사용됩니다.
  • V는 "값"유형입니다. 이것은 저장하고있는 유형입니다. 수동으로 반복보다
  • 사전이 어떤 상황에서 더 빠를 수 있습니다
    • VAR 값 = 사전 [키]
    • 사전 [키] = 값 :
    • 읽거나 인덱서를 사용하여 사전을 쓸 수 있습니다 목록을 통해 내부적으로 일치하는 항목을 검색하는 데 좋아하는 데이터 구조를 사용할 수 있으므로 대용량 데이터 집합의 경우 더 빠를 수 있습니다. 나는 GetHashCode를 사용하여 일치하는 후보를 찾는다 고 생각하지만,이 맥락에서는 중요하지 않을 것 같다.
  • 관련 문제