我有一个foreach循环,它循环着一个对象列表。它的含义是将NavigateUrl设置为超链接。我的代码如下所示:
foreach (var con in contacts)
{
if (con.ContactTypeID == 1)
{
FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
}
}
我想知道他们是否有更好的方法来做到这一点。我将有大约10个其他的ContactTypeID,如果不是,我宁愿不再写9个..
答案 0 :(得分: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!");
}
}
}
答案 1 :(得分:3)
你可以使用LINQ来做你想做的事。
var x = contacts.FirstOrDefault (c => c.ContactTypeID == 1);
if( x != null )
{
FacebookIcon.NavigateUrl = String.Format ("http://facebook.com/{0}", x.ContactURL);
}
答案 2 :(得分:0)
您可以使用开关
switch (caseSwitch)
{
case 1:
FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
break;
case 2:
//
break;
default:
//
break;
}
答案 3 :(得分:0)
你可以使用linq。
var con = contacts.FirsOrDefault(c => c.ContactTypeID.Equals(1));
if (con == null)
{
return;
}
con.NavigateUrl = "http://facebook.com/" + con.ContactURL;
或者如果你有更多的身份
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);
答案 4 :(得分:0)
如果您使用Linq,您应该使用First或FirstOrDefault
var url = contacts.FirstOrDefault(c => c.ContactTypeID == 1).NavigateUrl;
答案 5 :(得分:0)
使用开关:
foreach (var con in contacts)
{
switch (con.ContactTypeID)
{
case 1:
FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL;
break;
case 2:
. . .
break;
. . .
}
}
答案 6 :(得分:0)
Perhapse简明的LINQ:
contacts.ForEach(c => { if (c.ContactTypeID == 1) FacebookIcon.NavigateUrl = "http://facebook.com/" + con.ContactURL; });
如果您想为每个ContactTypeID == 1执行“it”。
答案 7 :(得分: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);
}
答案 8 :(得分: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)这只是一个用于设置导航网址的辅助类
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();