2017-11-07 10 views
1

cId(コースID)とcName(コース名)のDropDownListを使用しています。ただし、cNameが重複している場合は、にcNameと参加したいと思います。同様に:$"cName ({startDate})"リストの重複を編集するには?

これはどのように私のリストを見て:ありますので

var list = new List<(int cId, string cName, string startDate)> 
{ 
    (1, "Math", "1/12"), 
    (2, "Music", "1/12"), 
    (3, "English", "1/12"), 
    (4, "English", "11/4"), 
    (5, "Swedish", "1/12"), 
    (6, "Russia", "1/12") 
}; 

2英語でcNamestartDateはそれの文字列に追加する必要があり、のような:

cId cName 
---- ----- 
1 | "Math" 
2 | "Music" 
3 | "English (1/12)" 
4 | "English (11/4)" 
6 | "Swedish" 
7 | "Russia" 

私が気にしていたこと:

リストは、任意のEDIT

cName = $"cName ({startDate})"cNameを重複している場合:これは、リストをDropDownListコントロールに追加された方法です

foreach (var item in list) 
     { 
      dplCourse.Items.Add(new ListItem(item.cId, item.cName)); 
     } 

答えて

6

あなたがパスを行う必要があります重複しているものを見つけて重複の名前を変更してから表示リストに追加します。

var list = new List<(int cId, string cName, string startDate)> 
{ 
    (1, "Math", "1/12"), 
    (2, "Music", "1/12"), 
    (3, "English", "1/12"), 
    (4, "English", "11/4"), 
    (5, "Swedish", "1/12"), 
    (6, "Russia", "1/12") 
}; 

var duplicates = new HashSet<string>(
      list.GroupBy(x => x.cName) //Group the items by name 
       .Where(g => g.Count() > 1) //Find groups with more than 1 
       .Select(g => g.Key)); //Just add the names to the HashSet, not the group 

foreach (var item in list) 
{ 
    var displayName = item.cName 
    if(duplicates.Contains(displayName)) 
    { 
     displayName += $" ({item.startDate})"; 
    } 
    dplCourse.Items.Add(new ListItem(item.cId, displayName)); 
} 
0

最も簡単でスマートではないソリューションは、一意のアイテムでリストを作成することです。たとえば、cNameがすでに一意の値を持つ一時リストに存在する場合、foreachは条件を使用するという点でそれを達成できます。その後、重複しているアイテムを持つ新しい2番目の一時リストを作成し、それらのすべてをcName + startDateとして配置します。最後に、両方の一時リストを最終的なものにマージすることができます。

2

LINQを使用して表示名を取得できます。アイテムをグループ化したり、グループ内のアイテム数を確認したり、グループを展開してフラットなアイテムリストに戻すことができます。あなたはIDを持っているので、それに応じてアイテムを注文することができます(グルーピングは注文を壊します)。

var listItemsQry = 
    from item in list 
    group item by item.cName into itemGrp 
    let itemCount = itemGrp.Count() 
    from groupedItem in itemGrp 
    orderby groupedItem.cId 
    let itemName = itemCount > 1 ? 
     $"{groupedItem.cName} {groupedItem.startDate}" : 
     groupedItem.cName 
    select new ListItem(item.cId, itemName); 

foreach(ListItem item in listItemsQry) { 
    dplCourse.Items.Add(item); 
} 
+0

それは余分なハッシュセットを作成していないので、これはおそらく私の解決策よりもわずかに速く実行されます:

これは、すべては次のようになります。 –

+0

それは内部的にそうするかもしれません... @ScottChamberlain – Sefe

関連する問題