4

オブジェクトのリストが 2 つあります。1 つは値を持ち、もう 1 つは名前と値を持ちます。他のリストの値を調べて、その結果を pref.Name に書き込みたいと思います。foreach でこれを実行できることはわかっていますが、LINQ で実行する良い方法があると思います。アイデア?

public class Preference
    {
        public string Category { get; set; }
        public string Name { get; set; }
        public string ItemValue { get; set; }
        public int SortOrder { get; set; }
    }

public class SAPReadOnlyItem
    {
        public string Category { get; set; }
        public string Name { get; set; }
        public string ItemValue { get; set; }
    }

    List<Preference> preferences = getExistingUserPreferences(UserID, ddlCategory.SelectedValue); //this list is just keys
    List<SAPReadOnlyItem> sapReadOnlyItems = getSAPReadOnlyItems(ddlCategory.SelectedValue); //this list is names and keys

    //i want to look up the name from sapReadOnly using the ID from preferences and write it into preferences[n].Name

    //this works, but I want to write it into preferences[n].Name
    var foobar = (from sap in sapReadOnlyItems
                  join pref in preferences 
                  on sap.ItemValue equals pref.ItemValue
                  select new { asdf = sap.Name }).FirstOrDefault(); //instead of "select new" I want to write it into preferences[n].Name
4

4 に答える 4

6

Lambdaforeachを使用することをお勧めします

preferences.ForEach(preference =>
                {
                    var sap = sapReadOnlyItems.FirstOrDefault(s => s.ItemValue = preference.ItemValue);
                    preference.Name = (sap != null) ? sap.Name : string.Empty;
                });
于 2013-03-05T11:44:42.747 に答える
4

標準の linq 演算子を使用して、結合して名前を割り当てることができます。

var query = preferences.Join(sapReadOnlyItems, 
                             p => p.ItemValue, 
                             s => s.ItemValue, 
                             (p, s) => { p.Name = s.Name; return p; });
于 2012-10-16T20:57:02.400 に答える
0

私はこれを思いついた:

foreach (Preference pref in preferences)
{
    pref.Name = sapReadOnlyItems.Where(sapItem => sapItem.ItemValue == pref.ItemValue).FirstOrDefault().Name;
}
于 2012-10-16T19:02:39.470 に答える
0

あなたが望むことが特別なc#構文でできるとは思いません。むしろ、通常のメソッドチェーン構文を使用する必要があります。2 つのオプション:

方法 #1:

Linq 構文で使用する場合の foreach 拡張メソッドを次に示します。

sapReadOnlyItems.ForEach(s => preferences.Single(p => p.ItemValue == s.ItemValue).Name = s.Name);

これと一緒に使用:

public static void ForEach<T>(this IEnumerable<T> items, Action<T> action)
{
    foreach(T item in items)
    {
        action(item);
    }
}

方法 #2:

更新された設定を元に戻したい場合は、次のようにします。

var updatedPreferences = sapReadOnlyItems.Select(s => 
                         { 
                             var p = preferences.Single(p => p.ItemValue == s.ItemValue);
                             p.Name = s.Name;
                             return p;
                         });
于 2012-10-16T19:17:10.310 に答える