如果你的邏輯依賴於索引LINQ很少是正確的工具。與普通循環相比,它的可讀性,可維護性,有效性和可靠性都較差。
我會用像下面這樣的東西來創建兩個代表多對多關係的字典。注意for
-loop其在每次迭代遞增4,因爲這似乎是用戶組 - 「包」:
var userIdGroups = new Dictionary<int, HashSet<Group>>();
var groupIdUsers = new Dictionary<int, HashSet<User>>();
for(int i = 0; i < result.Length; i += 4)
{
int id;
if(int.TryParse(result[i], out id))
{
string name = result.ElementAtOrDefault(i + 1);
if(name == null)
continue; // end, invalid data
User user = new User{ UserId = id, Name = name };
string groupID = result.ElementAtOrDefault(i + 2);
if(!int.TryParse(groupID, out id))
continue; // end, invalid data
name = result.ElementAtOrDefault(i + 3);
if(name == null)
continue; // end, invalid data
Group group = new Group{ GroupId = id, Name = name };
HashSet<Group> userGroups;
HashSet<User> groupUsers;
if (userIdGroups.TryGetValue(user.UserId, out userGroups))
userGroups.Add(group);
else
userIdGroups.Add(user.UserId, new HashSet<Group>{ group });
if (groupIdUsers.TryGetValue(group.GroupId, out groupUsers))
groupUsers.Add(user);
else
groupIdUsers.Add(group.GroupId, new HashSet<User> { user });
}
}
結果是:
- 用戶詞典包含一個用戶兩組
- 組,字典包含兩組其映射到同一個用戶
您必須覆蓋Equals
和GetHashCode
來比較ID:
class User
{
public int UserId { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
User u2 = obj as User;
if (u2 == null) return false;
return UserId == u2.UserId;
}
public override int GetHashCode()
{
return UserId;
}
}
class Group
{
public int GroupId { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
Group g2 = obj as Group;
if (g2 == null) return false;
return GroupId == g2.GroupId;
}
public override int GetHashCode()
{
return GroupId;
}
}
因此,一個用戶可以屬於多個組(這將在這種情況下重複用戶)。所有用戶都屬於哪個用戶? – 2014-09-26 11:18:20
它是多對多的關係。一個用戶可以屬於多個組,一個用戶組可以包含多個用戶。 – Dawid 2014-09-26 11:20:56
那麼你如何區分用戶和組? – 2014-09-26 11:24:43