내 문제는 고전적인 문제라고 생각하지만 솔루션을 구현하는 올바른 방법을 얻을 수 없습니다. 그래서 저는 SOF에서 여기서 물어볼 것입니다.컬렉션의 데이터를 표로 표현하는 가장 좋은 방법
표와 같은 헤더와 값이 포함 된 CSV 파일로 일부 데이터를 내보내야합니다. 데이터를 얻으려면 컬렉션을 반복해야합니다. 컬렉션의 각 항목에는 키/값 쌍의 컬렉션이 들어있는 속성이 있습니다. 키에 머리글이 들어 있습니다. 키/값 쌍의 모든 콜렉션이 동일한 크기는 아닙니다.
키/값 쌍을 반복 할 때 컬렉션의 모든 가능한 헤더를 수집합니다. 이 콜렉션은 다른 키/값 콜렉션에 도달하고 알 수없는 키가 발견되면 확장됩니다. 이 경우 CSV 파일의 오른쪽 헤더 아래에 해당 값이 기록되는지 확인해야합니다. 헤더 컬렉션에서 헤더의 인덱스를 사용하려고했지만 작동하지 않을 수 있습니다. 다차원 배열, 가변 배열 및 사전과의 여러 조합에 대해 생각해 보았습니다.
내 솔루션의 경우 오른쪽 열을 찾을 때 머리글과 키 사이의 문자열 비교를하고 싶지 않습니다. 이것은 불필요한 것으로 보인다. 두 개의 루프와 인덱스가 있어야한다고 생각합니다.
좋아요, 여기까지 제 코드는 있습니다. ArrayList는 지정된 인덱스가 아닌 한 번에 하나씩 만 사용하므로 외부 루프의 1 개 항목에 대해서만 작동합니다. 머리글 컬렉션에 대한 새 항목이 외부 루프의 인덱스 12에 추가되면 루프의 values 컬렉션에는 아직 인덱스 12가 없습니다. 그래서 나는 범위 밖의 인덱스를 얻는다. 그래서 머리말 arraylist의 크기 arraylist 값을 만들 생각,하지만 그 중 하나를 작동하지 않습니다.
Private Shared Function GetData(listItems As SPClient.ListItemCollection) As ArrayList
'first store all values and make sure keys and values are matched
Dim resultsToStore As ArrayList = New ArrayList()
Dim headersToStore As ArrayList = New ArrayList()
resultsToStore.Add(headersToStore)
Dim totalListItems = listItems.Count
Dim fieldNotToStore = ConfigurationService.FieldValuesNotToStore
Dim displaynames = ConfigurationService.FieldValueDisplayNames
For index As Integer = 0 To totalListItems - 1
Dim valuesToStore As ArrayList = New ArrayList()
Dim item As SPClient.ListItem = listItems(index)
Dim fieldValues = item.FieldValues
For Each fieldValue In fieldValues
If (Not fieldNotToStore.Contains(fieldValue.Key)) Then 'If it is not in this collection is must be stored
Dim headerIndex = headersToStore.IndexOf(fieldValue.Key) 'does this key exist in the headersArray
If (headerIndex = -1) Then 'If fieldValue.Key is already in the array it doesn't need to be stored again (-1 = no index found)
Dim displayname = String.Empty
If (displaynames.ContainsKey(fieldValue.Key)) Then
displayname = displaynames.Item(fieldValue.Key)
Else
displayname = fieldValue.Key.ToString
End If
headerIndex = headersToStore.Add(displayname) '' Add new header
End If
valuesToStore.Insert(headerIndex, fieldValue.Value.ToString) 'use headerindex to match key an value
End If
Next
resultsToStore.Add(valuesToStore)
Next
Return resultsToStore
End Function
이 문제는 수천 번처럼 해결되었으므로 친절하시기 바랍니다.
업데이트 : 답변 : 다른 주류 언어 (vb.net) 이외의 언어로도 답변을 얻었 으면 좋겠지 만 vb.net과 C#은 둘 다 .net 프레임 워크에 있으므로 선호합니다.
감사합니다.
의견을 보내 주셔서 감사합니다. 나는이 방법이 길다는 것을 알고있다. 나중까지 리팩토링을 기다리고있었습니다. 나는 먼저 일하고 싶었지만 어쩌면 수업을 사용하는 것이 길일 수도 있습니다. 나는 그것이 필요에 따라 확장되기 때문에 나는 arraylist를 사용한다. 일반적인 목록도 그렇게하므로 실제로 효과가 없습니다. – Sigur
솔루션을 자세히 살펴 봅니다. 1. ValueStore 클래스가 사전과 유사하고 ResultStore가 사전 목록처럼 보입니다. 왜 그걸 사용하지 않니? 2. 솔루션에서조차도 ToSoSore.Insert (....) 문은 오류를 발생시킵니다. – Sigur
귀하의 의견을 영감으로 사용했습니다. 고마워. 이제는 훨씬 더 많은 OO가 있습니다. 많은 고마워요. – Sigur