0

オブジェクトのリストをループするforeachループがあります。その意味は、NavigateUrlをハイパーリンクに設定することです。私のコードは次のようになります。

foreach (var con in contacts)
        {
            if (con.ContactTypeID == 1)
            {
                FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
            }
        }

彼らがそれを行うためのより良い方法であるかどうか疑問に思います。他に約10個のContactTypeIDがありますが、それ以外の場合はさらに9個は記述しません。

4

9 に答える 9

3

LINQを使用できます:

var facebookURL = contacts.Where(c => c.ContactTypeID == 1)
              .Select(c => c.url)
              .FirstOrDefault();
if(facebookURL != null)
    FacebookIcon.NavigateUrl = "http://facebook.com/" + facebookURL;

編集:実際には、LINQの遅延実行を利用して、すべてのタイプの連絡先タイプに同じものを再利用できます。

var contactType = 1; // facebook
var url = contacts.Where(c => c.ContactTypeID == contactType)
      .Select(c => c.url);
if (url.Any())
    FacebookIcon.NavigateUrl = "http://facebook.com/" + url.First();
contactType = 2;    // google
if (url.Any())
    GoogleIcon.NavigateUrl = "http://Google.com/" + url.First();

編集2:これは、すべてのタイプをURLにマッピングする辞書を使用する別のアプローチです。これは、数百万のタイプがある場合に、より効率的であるはずです;-)(@MAfifi):

var urlTypeMapping = contacts.GroupBy(c => c.ContactTypeID)
    .ToDictionary(grp => grp.Key, grp => grp.Select(c => c.url));
foreach (var type in urlTypeMapping)
{
    var typeUrl = type.Value.FirstOrDefault();
    if (typeUrl != null)
    {
        switch (type.Key)
        {
            case 1:
                FacebookIcon.NavigateUrl = "http://facebook.com/" + typeUrl;
                break;
            case 2:
                GoogleIcon.NavigateUrl = "http://Google.com/" + typeUrl;
                break;
            default:
                break; //or throw new Exception("Invalid type!");
        }
    }
}
于 2012-04-18T08:39:58.143 に答える
3

必要なことを行うためにLINQを使用できます。

var x = contacts.FirstOrDefault (c => c.ContactTypeID == 1);

if( x != null )
{
   FacebookIcon.NavigateUrl = String.Format ("http://facebook.com/{0}", x.ContactURL);
}
于 2012-04-18T08:40:38.527 に答える
0

おそらく凝縮されたLINQ:

contacts.ForEach(c => { if (c.ContactTypeID  == 1) FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;  });

ContactTypeID==1ごとに「it」を実行する場合。

于 2012-04-18T08:45:32.423 に答える
0

各連絡先は必ずしもFacebookである必要はなく、連絡先に基づいて動的に異なる属性を設定する必要があると思いますか?

あなたの最善の策は、Dictionary<int, Action>または同様のものであり、あなたはただ次のようなことをします、

var setCorrectUrl = new Dictionary<int, Action<Contact>>
{
    // Appropriate entries in here, e.g. (syntax not quite right)
    {
        1,
        (contact) => FacebookIcon.NavigateUrl = contact.ContactURL;
    }
}

foreach (var con in contacts)
{
    setCorrectUrl[con.ContactTypeID](con);
}
于 2012-04-18T08:45:34.343 に答える
0

スイッチが使えます

switch (caseSwitch)
{
case 1: 
    FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
    break;
case 2:
    //
    break;
default:
    //
    break;

}

于 2012-04-18T08:40:39.247 に答える
0

linqを使用できます。

var con = contacts.FirsOrDefault(c => c.ContactTypeID.Equals(1));
if (con == null)
{
  return;
}

con.NavigateUrl = "http://facebook.com/" + con.ContactURL;

または、より多くのIDがある場合

List<int> ids = new List<int> {1,2,5,7};
contacts.Where(c => ids.Containt(c.ContactTypeID)).ToList().ForEach(item => item.NavigateUrl = "http://facebook.com/" + item.ContactURL);
于 2012-04-18T08:40:54.393 に答える
0

Linqを使用する場合は、FirstまたはFirstOrDefaultを使用する必要があります

var url = contacts.FirstOrDefault(c => c.ContactTypeID == 1).NavigateUrl;
于 2012-04-18T08:41:23.573 に答える
0

スイッチを使用します。

foreach (var con in contacts) 
    { 
        switch (con.ContactTypeID) 
        {
          case 1: 
            FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL; 
            break;
          case 2:
            . . . 
            break;
          . . . 
        } 
    } 
于 2012-04-18T08:42:31.007 に答える
0

さて、私はコードのリファクタリングを行います。彼が実装する他の10のタイプがあると想像してください:)上記のソリューションは実行可能ですが、拡張性の点ではあまりエレガントではありません。

だから、ここに私の解決策があります:

1)共通の連絡先プロパティを使用して基本クラスを実装します

public abstract class BaseContact
{
    public string Name { get; set; }
    public abstract string Url { get; set; }

}

2)具体的なタイプを実装する

public class FbContact : BaseContact
{
    private string _baseUrl = "http://facebook.com/{0}";
    private string _url = string.Empty;

    public override string Url
    {
        get { return _url; }
        set { _url = string.Format(_baseUrl, value); }
    }
}

public class LinkedInContact : BaseContact
{
    private string _baseUrl = "http://linkedin.com/{0}";
    private string _url = string.Empty;

    public override string Url
    {
        get { return _url; }
        set { _url = string.Format(_baseUrl, value); }
    }
}

3)これはナビゲーションURLを設定するための単なるヘルパークラスです

public static class NavigationCreator
{
    public static void SetUrl(BaseContact contact, HyperLink link)
    {
        link.NavigateUrl = contact.Url;
    }
}

4)結果を視覚化するためのいくつかのテストコード

        List<BaseContact> items = new List<BaseContact>();

        for (int i = 0; i < 5; i++)
        {
            BaseContact item;
            if (i % 2 == 0) item = new FbContact(); else item = new LinkedInContact();

            item.Url = "My name " + i;

            items.Add(item);
        }

        foreach (var contact in items)
        {
            HyperLink link = new HyperLink();
            NavigationCreator.SetUrl(contact, link);
            Console.WriteLine(link.NavigateUrl);
        }

        Console.Read();
于 2012-04-18T09:07:13.823 に答える