2017-03-17 55 views
0

我有一组数据,我可能最好在表/矩阵中保存一组数据。它是一个比赛统计数据的集合,其中有两队由5个角色组成的超过100个角色选择。在一场比赛中不能挑选两次角色。我想要做的是总结每个角色在整批比赛中杀死其他角色的次数。我想象的是在表格的标题和第一列都有一个包含所有字符的表格。每个单元格中的值是该行的字符多久会杀死该列的字符。如何在vb.net中创建字符串查找

我的问题是我有这样的数据;

Tom 1 Sarah 4 Juliet 3 Joe 
Dick 3 Sarah 2 Juliet - Joe 
Harry 1 Sarah 2 Juliet 5 Joe 

Sarah 3 Tom - Dick 1 Harry 
Juliet 1 Tom 2 Dick 3 Harry 
Joe - Tom 4 Dick - Harry 

第一行意味着汤姆杀了莎拉一次,朱丽叶4次和乔3次。

我的问题是有超过100个字符名称(汤姆,朱丽叶等),所以如何存储汤姆杀死莎拉多少次,而没有选择病例语句,每个字符有100个病例?理想情况下,我想给每个字符一个数字,然后有一个方形数组并存储这样的数字;

dim kills(100,100) as integer 
(1,23) +=1 
(1,34) +=4 
etc. 

在上面(1,23)可能是汤姆杀死莎拉汤姆的ID可以是1至Sarahs可能是23

+1

如果您愿意,您可能会更好地在数据库中保存这种信息并将杀死记录为交易。您可以将所有人存储在一个表中,然后每次在另一个表中杀掉其他人时记录它们。 – Bugs

回答

1

我不是一个LINQ的专家,但怎么是这样的:

Sub Main() 
    Dim Kills As New Dictionary(Of String, Dictionary(Of String, Integer)) 
    Dim Names As String = "Tom,Dick,Harry,John,Sarah,Jill" 
    Dim NameArray = Names.Split(",") 
    ' Create a dictionary of dictionaries to hold the kills 
    For Each killer As String In NameArray 
     Dim newKill As New Dictionary(Of String, Integer) 
     For Each victim As String In NameArray 
      newKill.Add(victim, 0) 
     Next 
     Kills.Add(killer, newKill) 
    Next 

    ' Tom Kills Sarah 
    Kills("Tom")("Sarah") += 1 
    Kills("Tom")("Sarah") += 1 
    ' Tom kills Jill 
    Kills("Tom")("Jill") += 1 
    Kills("Dick")("Tom") += 1 
    Kills("Dick")("Sarah") += 1 
    ' Get some numbers out 
    Dim SarahDies = Kills.Sum(Function(k) k.Value("Sarah")) 
    Dim JillDies = Kills.Sum(Function(k) k.Value("Jill")) 
    Dim DickDies = Kills.Sum(Function(k) k.Value("Dick")) 
    Dim TomKillsSarah = Kills("Tom")("Sarah") 
End Sub 
0

这里是另一个考虑的解决方案。使用自定义类来表示杀手/受害者的元组,并将其用作Dictionary中的键。

Public Class KillInfo 
    Implements IEquatable(Of KillInfo) 

    Public Property Killer As String 
    Public Property Victim As String 

    Public Sub New(killer As String, victim As String) 
     Me.Killer = killer 
     Me.Victim = victim 
    End Sub 

    Public Overrides Function GetHashCode() As Integer 
     Return Killer.GetHashCode() Xor Victim.GetHashCode() 
    End Function 

    Public Overrides Function Equals(obj As Object) As Boolean 
     If obj Is Nothing OrElse Me.GetType() IsNot obj.GetType() Then 
      Return False 
     End If 
     Return Equals(DirectCast(obj, KillInfo)) 
    End Function 

    Public Overloads Function Equals(other As KillInfo) As Boolean Implements IEquatable(Of KillInfo).Equals 
     Return other.Killer.Equals(Killer) AndAlso other.Victim.Equals(Victim) 
    End Function 
End Class 

然后使用它像这样

Dim Names As String = "Tom,Dick,Harry,John,Sarah,Jill" 
Dim NameArray = Names.Split(",") 

Dim KillSum As New Dictionary(Of KillInfo, Integer) 

For Each killer As String In NameArray 
    For Each victim As String In NameArray 
     KillSum.Add(New KillInfo(killer, victim), 0) 
    Next 
Next 

KillSum(New KillInfo("Tom", "Dick")) += 10 
KillSum(New KillInfo("Tom", "Dick")) += 23 
KillSum(New KillInfo("Harry", "Jill")) += 56 
KillSum(New KillInfo("Jill", "Harry")) += 25 

For Each info In KillSum 
    Console.WriteLine($"{info.Key.Killer} killed {info.Key.Victim} {info.Value} times.") 
Next 

注:我不知道,如果Tuple(Of K,V)会的方式,这将是一个字典,这是可用的已实现自身GetHashCode()Equals()为什么我写了KillInfo类。如果Tuple事实上确实如此,那么您可以跳过我的课程并正确使用使用部分。